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
pthread_setconcurrency
int pthread_getconcurrency (int new_level);
Allows the application to inform the threads implementation of its desired minimum concurrency level. The actual level of concurrency resulting from this call is unspecified.
References: 5.6.3, 10.1.3
Errors: [EINVAL] new_level is negative.
[EAGAIN] new_level exceeds a system resource.
Hint: Concurrency level is a hint. It may be ignored by any implementa-
tion, and
10.1.4 Stack guard size
Guard size comes from DCE threads. Most thread implementations add to the thread's stack a "guard" region, a page or more of protected memory. This protected page is a safety zone, to prevent a stack overflow in one thread from corrupting another thread's stack. There are two good reasons for wanting to control a thread's guard size:
1. It allows an application or library that allocates large data arrays on the stack to increase the default guard size. For example, if a thread allocates two pages at once, a single guard page provides little protection against stack overflows — the thread can corrupt adjoining memory without touching the protected page.
2. When creating a large number of threads, it may be that the extra page for each stack can become a severe burden. In addition to the extra page, the kernel's memory manager has to keep track of the differing protection on adjoining pages, which may strain system resources. Therefore, you may sometimes need to ask the system to "trust you" and avoid allocating any guard pages at all for your threads. You can do this by requesting a guard size of 0 bytes.
pthread_attr_getguardsize
int pthread_attr_getguardsize (