Динамически инициализировать пакеты
#include <pthread.h>pthread_once_t once_control = PTHREAD_ONCE_INIT;int pthread_once( pthread_once_t *once_control,void (*init_routine)( void ) );
pthread_once_t
, который функция использует, чтобы определить, следует ли запускать код инициализации. Необходимо установить значение объекта pthread_once_t в макрос PTHREAD_ONCE_INIT , прежде чем использовать его в первый раз. |
libc
Функция pthread_once() использует объект одноразового управления once_control, чтобы определить, следует ли вызывать подпрограмму инициализации init_routine.
Необходимо выделять объект управления только в обычных отображениях памяти. В противном случае это приведет к сбою некоторых процессоров (например, PPC). |
Первый вызов pthread_once() любым потоком в процессе с данным once_control вызывает без аргументов. Последующие вызовы pthread_once() с тем же once_control не будут вызывать init_routine.
Ни один поток не будет выполняться после этой функции, пока init_routine не завершится. |
В этом примере показано, как можно использовать однократную инициализацию для инициализации библиотеки; как library_entry_point1(), так и library_entry_point2() необходимо инициализировать библиотеку, но это должно произойти только один раз:
#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... */}
Это инициализирует библиотеку один раз; если несколько потоков вызывают pthread_once(), только один фактически входит в функцию library_init(). Другие потоки блокируются при вызове pthread_once() до тех пор, пока library_init() не завершится. Функция pthread_once() также гарантирует, что library_init() вызывается только один раз; последующие вызовы точек входа в библиотеку пропускают вызов library_init().
POSIX 1003.1 Threads
Предыдущий раздел: Описание API системной библиотеки