Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈ распрСдСлСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 173

Автор Π₯ьюз ΠšΠ°ΠΌΠ΅Ρ€ΠΎΠ½

Ѐункция pthread_once () Π½Π΅ являСтся Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΡ‚ ΠΌ Π΅Π½Ρ‹. Но Ссли функция init_routine являСтся Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΡ‚ ΠΌ Π΅Π½Ρ‹, ΠΈ ΠΎΡ‚ ΠΌ Π΅Π½Π° Ρ‚Π°ΠΊΠΈ происходит, Ρ‚ΠΎ Π΅Π΅ воздСйствиС Π½Π° ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ once_control Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈ ΠΌ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ функция pthread_once () Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ.

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° PTHREAD_ONCE_INIT опрСдСляСтся Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ <pthread. h>.

ПовСдСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_once () Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ ΠΌ, Ссли ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ once_control ΠΈ ΠΌ Π΅Π΅Ρ‚ Π°Π²Ρ‚ΠΎ ΠΌ атичСский класс ΠΏΠ° ΠΌ яти (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого класса Ρ€Π°Π· ΠΌ Π΅ Ρ‰ Π°ΡŽΡ‚ΡΡ Π² стСкС ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ всякий Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Π±Π»ΠΎΠΊ, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹, ΠΈΡ€Π°Π·Ρ€ΡƒΡˆΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· этого Π±Π»ΠΎΠΊΠ°) ΠΈΠ»ΠΈ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ константой PTHREAD_ONCE_INIT.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ функция pthread_once () Π²ΠΎΠ·Π²Ρ€Π° Ρ‰ Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎ ΠΌ случаС β€” ΠΊΠΎΠ΄ ошибки, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π΅Π΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€.

Ошибки

Ѐункция pthread_once() ΠΌ ΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ссли:

[EINVAL] значСния, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€Π° ΠΌ ΠΈ once_control ΠΈΠ»ΠΈ init_routine, Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹. Ѐункция pthread_once() Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ошибки [EINTR].

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

ЗамСчания ΠΏΠΎ использованию

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

ЛогичСскоС обоснованиС

НСкоторыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ для Π΄ΠΈΠ½Π° ΠΌ ичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ глобальная инициализация для Ρ‚Π°ΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ выполняСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π° ΠΌΠΌ Π΅ это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рСализуСтся с использованиС ΠΌ статичСской ΠΏΠ΅Ρ€Π΅ ΠΌ Π΅Π½Π½ΠΎΠΉ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ провСряСтся ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈ ΠΌ Π΅Ρ€:

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 <pthread.h>

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 Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ массивом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… компиляторов конструкция &<array_name> Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠ°.

Π‘ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ направлСния

ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π’ΠΎΠΌ Base Definitions стандарта1Π•Π•Π•Std 1003.1-2001, <pthread.h>.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² выпускС 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 <pthread.h>

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() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния ΠΈ записи, адрСсуСмого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ rwlock, ΠΈ освобоТдСния Π»ΡŽΠ±Ρ‹Ρ… рСсурсов, задСйствованных этой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ использования этой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ посрСдство ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ обращСния ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_rwlock_init(). Π’ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ функция pthread_rwlock_destroy () ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, адрСсуСмый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ rwlock, Ρ€Π°Π²Π½Ρ‹ΠΌ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли функция pthread_rwlock_destroy() вызываСтся Π² Ρ‚ΠΎ Π²Ρ€Π΅ ΠΌ я, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, адрСсуС ΠΌ Ρ‹ΠΉ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎΠΌ rwlock. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ повСдСнию.

Ѐункция pthread_rwlock_init() выдСляСт Π»ΡŽΠ±Ρ‹Π΅ рСсурсы, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи, адрСсуСмого ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎΠΌ rwlock, ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ (ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π½Π΅Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС) с использованиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², адрСсуС ΠΌ ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎ ΠΌ attr. Если ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ attr содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL, для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния ΠΈ записи Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎ Ρƒ ΠΌ ΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ; Ρ‚.Π΅. Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² это ΠΌ случаС равносилСн ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ адрСса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, содСрТащСго стандартныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи. ПослС ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС число Ρ€Π°Π· Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли функция pthread_rwlock_init () Π²Ρ‹Π·Π²Π°Π½Π° с Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_rwlock_init() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, адрСсуСмый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎ ΠΌ rwlock, остаСтся Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ ΠΌ, Π° содСрТимоС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° rwlock β€” Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ.

Для выполнСния синхронизации ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, адрСсуСмый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ rwlock. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ссылки Π½Π° ΠΊΠΎΠΏΠΈΠΈ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthread_rwlock_destroy(), pthread_rwlock_rdlock(), pthread_rwlock_ti~ medrdlock(), pthread_rwlock_timedwrlock(), pthread_rwlock_tryrdlock(), pthread_rwlock_trywrlock (), pthread_rwlock_unlock () ΠΈΠ»ΠΈ pthread_rwlock_ wrlock () Π½Π΅ ΠΎΠΏΡ€Π΅ Π΄ Π΅Π»Π΅Π½.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_rwlock_destroy() ΠΈ pthread_rwlock_init () Π²ΠΎΠ·Π²Ρ€Π° Ρ‰ Π°ΡŽΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎ ΠΌ случаС β€” ΠΊΠΎΠ΄ ошибки, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽ Ρ‰ ΠΈΠΉ Π΅Π΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ошибок с ΠΊΠΎΠ΄Π° ΠΌ ΠΈ [EBUSY] ΠΈ [EINVAL] Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° (Ссли Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠΎΠ± Ρ‰ Π΅) Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½Π° выполняСтся Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΊΠΎΠ΄ ошибки Π² случаС Π΅Π΅ обнаруТСния возвращаСтся Π΄ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния ΠΈ записи, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ rwlock.

Ошибки

Ѐункция pthread_rwlock_destroy () ΠΌ ΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ, Ссли:

[EBUSY]  рСализация ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, адрСсуС ΠΌ Ρ‹ΠΉ ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎ ΠΌ rwlock;