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

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

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

}

Π’ листингС 5.1 ΠΏΠΎΡ‚ΠΎΠΊΠΈ ThreadA ΠΈ ThreadB содСрТат критичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹, Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΡ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Mutex.

Π’ листингС 5.2 дСмонстрируСтся, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ критичСских Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² процСссов.

// Листинг 5.2. ИспользованиС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² для Π·Π°ΡˆΠΈΡ‚Ρ‹

// критичСских Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² процСссов

//...

int Rt;

pthread_mutex_t Mutexl ; pthread_mutexattr_t MutexAttr;

int main(void) {

//...

pthread_mutexattr_init (&MutexAttr); pthread_mutexattr_setpshared(

&MutexAttr,

PTHREAD_PROCESS_SHARED ) ;

pthread_mutex_init (&Mutexl, &MutexAttr) ; if((Rt = fork()) == 0){

// Π‘Ρ‹Π½ΠΎΠ²Π½ΠΈΠΉ процСсс.

pthread_mutex_lock(&Mutexl);

// ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π».

pthread_mutex_unlock(&Mutexl) ;

}

else{

// Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс,

pthread_mutex_lock(&Mutexl); // ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π». pthread_mutex_unlock(&Mutexl) ;

}

//.. .

return(0);

}

Рис. 5.5. Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΈ раздСляСмыС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹

Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² листингС 5.2 ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ инициализируСтся ΠΊΠ°ΠΊ раздСляСмый:

pthread_mutexattr_setpshared(&MutexAttr,PTHREAD_PROCESS_SHARED);

Установка этого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ PTHREAD_PROCESS_SHARED позволяСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Mutex ΡΡ‚Π°Ρ‚ΡŒ раздСляСмым ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссов. ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork () сыновний ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСссы ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒ свои критичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Mutex. ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ этих процСссов ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рСсурсы, раздСляСмыС ΠΎΠ±ΠΎΠΈΠΌΠΈ процСссами.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи

ΠœΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹Π΅ сСмафоры ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ критичСскими Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ, обСспСчивая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ Π² эти Ρ€Π°Π·Π΄Π΅Π»Ρ‹. Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Ρ…ΠΎΠ΄ Π² критичСский Ρ€Π°Π·Π΄Π΅Π» Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈΠ»ΠΈ процСссу. РСализуя Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄ Π² критичСский Ρ€Π°Π·Π΄Π΅Π» сразу нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, Ссли ΠΎΠ½ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Ρ‹ лишь ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· раздСляСмой памяти. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ для чтСния ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π»Π°Π΄Π΅Ρ‚ΡŒ любоС количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Но Ссли сразу нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ памяти, Ρ‚ΠΎ доступ для этого Π±ΡƒΠ΄Π΅Ρ‚ прСдоставлСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π½ΠΈΠΊΠ°ΠΊΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² критичСский Ρ€Π°Π·Π΄Π΅Π», Ссли ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ прСдоставлСн ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ для записи Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ, Ссли прилоТСния Ρ‡Π°Ρ‰Π΅ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΈΡ…. Если Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ создаСтся мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², организация Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ доступа ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ излишнСй прСдостороТ Π½ ΠΎΡΡ‚ΡŒΡŽ. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ прилоТСния ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ, Ссли Π² Π½Π΅ ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ ΠΌ Π΅Π½Π½ΠΎΠ΅ считываниС Π΄Π°Π½Π½Ρ‹Ρ… нСскольки ΠΌ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌ ΠΈ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX опрСдСляСт ΠΌ Π΅Ρ…Π°Π½ΠΈΠ· ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи посрСдство ΠΌ Ρ‚ΠΈΠΏΠ° pthread_rwlock_t.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для чтСния ΠΈ записи ΠΈ ΠΌ Π΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΈ ΠΌ ΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹Π΅ сСмафоры. Они пСрСчислСны Π² Ρ‚Π°Π±Π». 5.4.

Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² опСрациях запроса Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ВмСсто ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ блокирования здСсь прСдусмотрСно Π΄Π²Π΅:

pthread_rwlock_rdlock()

pthread_rwlock_wrlock ()

Ѐункция pthread_rwlock_rdlock() прСдоставляСт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽ Ρ‰ Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния, Π° функция pthread_rwlock_wrlock() β€” Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи. Запросив Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния, ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π΅Π΅ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π½Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи. Если ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся. Если ΠΏΠΎΡ‚ΠΎΠΊ запросит Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи, ΠΎΠ½ Π΅Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π½Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи. Если ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния-записи рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° pthread_rwlock_t. Π­Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ установки ΠΈ чтСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² пСрСчислСны Π² Ρ‚Π°Π±Π». 5.5.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° pthread_rwlock_t ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (для раздСлСния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса) ΠΈΠ»ΠΈ раздСляСмым (для Ρ€Π°Π·Π΄Π΅ Π» Сния ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… процСссов).

Π’Π°Π±Π»ΠΈΡ†Π° 5.4. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‡ Ρ‚ Сния-записи

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

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

Запрос Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ

β€’ int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

β€’ int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

β€’ int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict abs_timeout);

β€’ int pthread_rwlock_timedwrlock( pthread_rwlock_t | *restrict rwlock, const struct timespec *restrict abs_timeout);

ОсвобоТдСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

β€’ int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

ВСстированиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

β€’ int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

β€’ int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

Π Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅

β€’ int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

Π’Π°Π±Π»ΠΈΡ†Π° 5.5. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‚ΠΈΠΏΠ° pthread_rwlock_t

β€’ int pthread_rwlockattr_init (pthread_rwlockattr_t * attr); Β Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи,Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr , значСниями, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ

β€’ int pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr) Π Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π± Π» ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи,Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Π²Ρ‹Π·Π²Π°Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_rwlockattr_init ()

β€’ int pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, int pshared); int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * restrict attr, int *restrict pshared); УстанавливаСт ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ process-shared Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ attr . ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pshared ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

β€’ PTHREAD_PROCESS_SHARED (Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π± Π» ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния-записи, Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ процСссам);

β€’ PTHREAD_PROCESS_PRIVATE (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния-записи раздСляСтся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса)

ИспользованиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния-записи для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ стратСгии доступа

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ стратСгии доступа CREW (ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ запись). Богласно этой стратСгии Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдоставлСна сразу нСскольким Π·Π°Π΄Π°Ρ‡Π°ΠΌ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΏΡ€Π°Π²ΠΎ доступа для записи. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ монопольной записи Π² этом случаС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π°Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. ИспользованиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния-записи для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ критичСских Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² продСмонстрировано Π² листингС 5.3.

// Листинг 5.3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ

// чтСния-записи

//...

pthread_t ThreadA, ThreadB, ThreadC, ThreadD ; pthread_rwlock_t RWLock;

void *producerl(void *X) {

pthread_rwlock_wrlock(&RWLock) ; // ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ раэдСл.

pthread_rwlock_unlock(&RWLock) ; return(0);