pthread_once()

Динамически инициализировать пакеты

Прототип:

#include <pthread.h>
pthread_once_t once_control = PTHREAD_ONCE_INIT;
int pthread_once( pthread_once_t *once_control,
void (*init_routine)( void ) );

Аргументы:

once_control
Указатель на объект pthread_once_t, который функция использует, чтобы определить, следует ли запускать код инициализации.

Note: Необходимо установить значение объекта pthread_once_t в макрос PTHREAD_ONCE_INIT, прежде чем использовать его в первый раз.

init_routine
Функция, которую требуется вызвать для выполнения необходимой инициализации.

Библиотека:

libc

Описание:

Функция pthread_once() использует объект одноразового управления once_control, чтобы определить, следует ли вызывать подпрограмму инициализации init_routine.


Caution: Необходимо выделять объект управления только в обычных отображениях памяти. В противном случае это приведет к сбою некоторых процессоров (например, PPC).

Первый вызов pthread_once() любым потоком в процессе с данным once_control вызывает без аргументов. Последующие вызовы pthread_once() с тем же once_control не будут вызывать init_routine.


Note: Ни один поток не будет выполняться после этой функции, пока init_routine не завершится.

Возвращаемое значение:

EOK
Успешное завершение.
EINVAL
Неинициализированный однократно управляемый объект once_control.

Примеры:

В этом примере показано, как можно использовать однократную инициализацию для инициализации библиотеки; как 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 системной библиотеки