Calls an initialization routine that can be executed by a single thread, once.
pthread_once( once_control, init_routine );
Argument Data Type Accessonce_control opaque pthread_once_t modify init_routine procedure read
#includeint pthread_once ( pthread_once_t *once_control, void (*init_routine) (void));
For example, a mutex or a per-thread context key must be created exactly once. Calling pthread_once ensures that the initialization is serialized across multiple threads. Other threads that reach the same point in the code would be delayed until the first thread is finished.
The pthread_once_t variable must be statically initialized using the PTHREAD_ONCE_INIT macro or by zeroing out the entire structure.
The PTHREAD_ONCE_INIT macro, defined in the
Note that it is often easier to simply lock a statically initialized
mutex, check a control flag, and perform necessary initialization
(in-line) rather than using pthread_once. For example, code an init
routine beginning with the following basic logic:
0 Successful completion.
[EINVAL] Invalid argument.
pthread_once_t once_control = PTHREAD_ONCE_INIT;
init()
{
static pthread_mutex_t mutex = PTHREAD_MUTEX_INIT;
static int flag = FALSE;
pthread_mutex_lock(&mutex);
if(!flag)
{
flag = TRUE;
/* initialize code */
}
pthread_mutex_unlock(&mutex);
}
Return Values
If an error occurs, this routine returns an integer indicating the
type of error. Possible return values are as follows:
Return Description