}
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 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);