pthread_once()
Dynamic package initialization
Synopsis:
#include <pthread.h>
pthread_once_t once_control = PTHREAD_ONCE_INIT;
int pthread_once( pthread_once_t* once_control,
void (*init_routine)(void) );
Arguments:
- once_control
- A pointer to a pthread_once_t object that the function
uses to determine whether or not to run the initialization code.
Note:
- You must set the pthread_once_t object to the macro PTHREAD_ONCE_INIT before using it for the first time.
- It's always safe, and typically faster, to assure that once_control is 32-bit aligned.
- init_routine
- The function that you want to call to do any required initialization.
Library:
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
Description:
The pthread_once() function uses the once-control object once_control to determine whether the initialization routine init_routine should be called.
The first call to pthread_once() by any thread in a process, with a given once_control, calls init_routine with no arguments. Subsequent calls of pthread_once() with the same once_control won't call init_routine.
The pthread_once() function isn't a cancellation point. However, if init_routine is a cancellation point and is cancelled, the effect on once_control is as if pthread_once() was never called.
Returns:
- EOK
- Success.
This function can return any error code indicated by pthread_mutex_lock().
Examples:
This example shows how you can use once-initialization to initialize a library; both library_entry_point1() and library_entry_point2() need to initialize the library, but that needs to happen only once:
#include <stdio.h>
#include <pthread.h>
pthread_once_t once_control = PTHREAD_ONCE_INIT;
void library_init( void )
{
/* initialize the library */
}
void library_entry_point1( void )
{
pthread_once( &once_control, library_init );
/* do stuff for library_entry_point1... */
}
void library_entry_point2( void )
{
pthread_once( &once_control, library_init );
/* do stuff for library_entry_point2... */
}
This initializes the library once; if multiple threads call pthread_once(), only one actually enters the library_init() function. The other threads block at the pthread_once() call until library_init() has returned. The pthread_once() function also ensures that library_init() is only ever called once; subsequent calls to the library entry points skip the call to library_init().
Classification:
Safety: | |
---|---|
Cancellation point | No |
Signal handler | No |
Thread | Yes |