counts on an implementation
All mutexes, regardless of type, are created using pthread_mutex_init, destroyed using pthread_mutex_destroy, and manipulated using pthread_mutex_ lock, pthread_mutex_unlock, and pthread_mutex_trylock.
| pthread_mutexaftr_gettype
int pthread_mutexattr_gettype (
const pthread_mutexattr_t *attr,
int *type);
Specify the type of mutexes created with attr.
type
Unspecified type.
Basic mutex, with no error
checking.
PTHREAD_MUTEX_RECURSIVE Thread can relock a mutex it
owns.
PTHREAD_MUTEX_ERRORCHECK Checks for usage errors.
References: 3.2,5.2.1,10.1.2
Errors: [EINVAL] type invalid.
[EINVAL] attr invalid.
Hint:
ful for debugging;
PTHREAD_MUTEX_DEFAULT
PTHREAD_MUTEX_NORMAL
pthread_mutexattr_settype
int pthread_mutexattr_settype (
pthread_mutexattr_t int
*attr, type);
Determine the type of mutexes created with attr.
type
PTHREAD_MUTEX_DEFAULT Unspecified type.
PTHREAD_MUTEX_NORMAL
Basic mutex, with no error checking.
PTHREAD_MUTEX_RECURSIVE Thread can relock a mutex it
owns.
PTHREAD_MUTEX_ERRORCHECK Checks for usage errors.
References: 3.2,5.2.1,10.1.2
Errors: [EINVAL] type invalid.
[EINVAL] attr invalid.
Hint:
ful for debugging;
10.1.3 Set concurrency level
When you use Pthreads implementations that schedule user threads onto some smaller set of kernel entities (see Section 5.6.3), it may be possible to have
Some implementations, for example, 'lock' a kernel entity to a user thread that blocks in the kernel, until the blocking condition, for example an I/O request, is completed. The system will create some reasonable number of kernel execution entities for the process, but eventually the pool of kernel entities may become exhausted. The process may be left with threads capable of performing useful work for the application, but no way to schedule them.
The pthread_setconcurrency function addresses this limitation by allowing the application to ask for more kernel entities. If the application designer realizes that 10 out of 15 threads may at any time become blocked in the kernel, and it is important for those other 5 threads to be able to continue processing, then the application may request that the kernel supply 15 kernel entities. If it is important that at least 1 of those 5 continue, but not that all continue, then the application could request the more conservative number of 11 kernel entities. Or if it is OK for all threads to block once in a while, but not often, and you know that only rarely will more than 6 threads block at any time, the application could request 7 kernel entities.
The pthread_setconcurrency function is a hint, and implementations may ignore it or modify the advice. You may use it freely on any system that conforms to the UNLX98 brand, but many systems will do nothing more than set a value that is returned by pthread_getconcurrency. On Digital UNIX, for example, there is no need to set a fixed concurrency level, because the kernel mode and user mode schedulers cooperate to ensure that ready user threads cannot be prevented from running by other threads blocked in the kernel.
pthread_getconcurrency
int pthread_getconcurrency ();
Returns the value set by a previous pthread_setconcurrency call. If there have been no previous calls to pthread_setconcurrency, returns 0 to indicate that the implementation is maintaining the concurrency level automatically.
References: 5.6.3, 10.1.3 Errors: none.
Hint: Concurrency level is a hint. It may be ignored by any implementa-
tion, and