Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 451

ер:

>static int random_is_initialized = 0;

>extern int initialize_random ();

>int random_function () {

> if (random_is_initialized == 0) {

> initialize_random ();

> random_is_initialized = 1;

>}

>... /* Операции, выполняемые после инициализации. */

>}

Чтобы хранить такую же структуру в многопоточной программе, нужно использовать новый примитив. В противном случае инициализация библиотеки должна быть выполнена путем явного вызова экспортированной функции инициализации до какого бы то ни было использования этой библиотеки.

Для динамической инициализации в многопоточном процессе недостаточно простого флага инициализации; этот флаг необходимо защищать от модификации данных со стороны нескольких потоков, одновременно обращающихся к библиотеке. Защита флага требует использования мьютекса, однако мьютексы должны быть инициализированы до их использования. Для гарантии того, что мьютекс инициализируется только единожды, требуется рекурсивное решение этой проблемы.

Использование функции pthread_once () не только предоставляет гарантированные реализацией средства дина м ической инициализации, но и способствует надежному функционированию многопоточных систем реального вре м ени. Предыдущий пример с учетом вышесказанного принимает следующий вид.

> #include

>static pthread_once_t random_is_initialized =PTHREAD_ONCE_INIT;

>extern int initialize_random();

>int random_function()

>{

> (void) pthread_once (&random_is_initialized,initialize_random); ...

>/* Операции, выполняемые после инициализации. */

>}

Обратите вни м ание на то, что тип pthread_once_t не может быть массивом, поскольку для некоторых компиляторов конструкция & неприемлема.

Будущие направления

Отсутствуют.

Смотри также

Том Base Definitions стандарта1ЕЕЕStd 1003.1-2001, .

Последовательность внесения изменений

Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширением POSIX Threads Extension.

Issue 6

Функция pthread_once () от м ечена как часть опции Threads.

Был добавлен код ошибки [EINVAL], возвращаемый при неудачном завершении функции в случае, если хотя бы один из аргументов недействителен.

pthread_rwlock_destroy, pthread_rwlock_init

Имя

pthread_rwlock_destroy, pthread_rwlock_init — функции разрушения и инициализации объекта блокировки для чтения и записи.

Синопсис

THR

#include

int pthread_rvlock_destroy(pthread_rwlock_t *rwlock);

int pthread_rwlock_init( pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

Описание

Функция pthread_rwlock_destroy() используется для разрушения объекта блокировки чтения и записи, адресуемого параметром