Middleware, development tools, realtime operating system
software and services for superior embedded design


Home
QNX Community Resources
Developer Support
QNX Documentation Library
QNX Developer Support

QNX Developer Support

QNX Software Systems
Developer Resources
Blogs
Board support packages
Foundry27 projects
Forums
Hardware support listing
Online video tutorials
Product documentation
Technical Articles

[Previous] [Contents] [Index] [Next]

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.

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.


Note: No thread will execute past this function until the init_routine returns.

Returns:

EOK
Success.
EINVAL
Uninitialized once-control object once_control.

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_point1... */
}

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:

POSIX 1003.1 THR

Safety:
Cancellation point No
Interrupt handler No
Signal handler Yes
Thread Yes

[Previous] [Contents] [Index] [Next]