ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΠ·ΠΎΠ²Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ.
ΠΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π° Π²ΡΠ·ΠΎΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ rwlock-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ (ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ):
int pthread_rwlock_init(pthread_rwlock_t *lock,
const pthread_rwlockattr_t *attr);
int pthread_rwlock_destroy(pthread_rwlock_t *lock);
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_init() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ lock (ΡΠΈΠΏΠ° pthread_rwlock_t) ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ attr. Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Π°ΡΡΠΈΠ±ΡΡ NULL, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ Β«ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡΒ». ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΡΠΌ. Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ:
pthread_rwlockattr_init();
pthread_rwlockattr_destroy();
pthread_rwlockattr_getpshared();
pthread_rwlockattr_setpshared().
ΠΠΎΠ³Π΄Π° ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠΌ ΡΠ²ΠΎΠΈ Π΄Π΅Π»Π° Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ, Π΅Ρ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ½ΠΈΡΡΠΎΠΆΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ pthread_rwlock_destroy().
ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π»ΠΈΠ±ΠΎ ΡΠΆΠ΅ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½Π°, Π»ΠΈΠ±ΠΎ Π΅ΡΠ΅ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°.
ΠΠ°Π»Π΅Π΅, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ±ΡΠ°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΈΠΏΠ°. ΠΠ°ΠΊ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΎΡΡ Π²ΡΡΠ΅, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π²Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ: Β«ΡΠΈΡΠ°ΡΠ΅Π»ΡΒ» ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Β«Π½Π΅ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΠΉΒ» Π΄ΠΎΡΡΡΠΏ, Π° Π΄Π»Ρ Β«ΠΏΠΈΡΠ°ΡΠ΅Π»ΡΒ» β Β«ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΡΠΉΒ». ΠΠ»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½, ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°Π·Π²Π°Π½Ρ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΡΠ²ΠΎΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ:
int pthread_rwlock_rdlock(pthread_rwlock_t *lock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock);
int pthread_rwlock_wrlock(pthread_rwlock_t* lock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *lock);
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ΅ΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π° Π½Π΅ Π΄Π²Π΅, ΠΊΠ°ΠΊ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Β«ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡΠΌΠΈΒ» ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π±ΡΠ»ΠΈ pthread_rwlock_rdlock() ΠΈ pthread_rwlock_wrlock(), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Β«ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌΠΈΒ» ΠΈ Β«ΠΏΠΈΡΠ°ΡΠ΅Π»ΡΠΌΠΈΒ», ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
ΠΡΠΎ β ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ: Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄Π»Ρ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π°, ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½. ΠΠΎΠ³Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΈΠ· ΡΠ΅Π³ΠΎ ΠΎΠ½ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠΌΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ ΡΠ΅ΡΡΡΡΡ.
ΠΠ½ΠΎΠ³Π΄Π°, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π·Π°Ρ ΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ, ΠΆΠ΅Π»Π°Ρ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ·Π½Π°ΡΡ, Π΄ΠΎΡΡΡΠΏΠ½Π° Π»ΠΈ Π½ΡΠΆΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π²Π΅ΡΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ Π² ΠΈΠΌΠ΅Π½ΠΈ Β«tryΒ» (Β«ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°Β»). ΠΠ°ΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Β«ΠΏΡΠΎΠ²Π΅ΡΠΎΡΠ½ΡΠ΅Β» Π²Π΅ΡΡΠΈΠΈ ΠΏΠΎΠ»ΡΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π΄ΠΎΡΡΡΠΏΠ½Π°, Π½ΠΎ Π΅ΡΠ»ΠΈ Π½Π΅Ρ, ΡΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ, Π° ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΡΡ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π΄ΠΎΡΡΡΠΏΠ½Π°, ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊ Ρ ΠΎΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π΅ Ρ ΠΎΡΠ΅Ρ ΠΆΠ΄Π°ΡΡ, Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ. ΠΠΎΡΠΎΠΊ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_rwlock_tryrdlock(), ΠΈ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½Π°. ΠΡΠ»ΠΈ Π±Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_rwlock_tryrdlock() Π½Π΅ Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π»Π° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ Π½Π΅ΠΏΡΠΈΡΡΠ½ΡΠ΅ Π²Π΅ΡΠΈ β Π½Π°Ρ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠ³ Π±Ρ Π±ΡΡΡ, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, Π²ΡΡΠ΅ΡΠ½Π΅Π½ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, Π° ΡΠΎΡ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΌΠΎΠ³ Π±Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π½ΡΠΆΠ½ΡΠΉ Π½Π°ΠΌ ΡΠ΅ΡΡΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ Π±ΡΠ»Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΏΠΎΡΠ»Π΅ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΅ΠΌΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ pthread_rwlock_rdlock(), ΠΈ Π²ΠΎΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π² ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊ, Π½Π΅ ΠΆΠ΅Π»Π°ΡΡΠΈΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ Β«ΠΏΡΠΎΠ²Π΅ΡΠΎΡΠ½ΡΡΒ» Π²Π΅ΡΡΠΈΡ, ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½!
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π°ΠΌΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠΏΠΎΡΠΎΠ± Π΅Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ:
int pthread_rwlock_unlock(pthread_rwlock_t* lock);
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ» Π½ΡΠΆΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Ρ ΡΠ΅ΡΡΡΡΠΎΠΌ, ΠΎΠ½ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_rwlock_unlock(). ΠΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΡΠΎΡΠ΅Π½ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΡΠΎ ΡΡΠΎΡ ΠΆΠ΄ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ (READY).
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΠΌΡ Π½Π΅ ΡΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΡΡ ΡΠΎΡΠΌΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΡΡΠ΅ΠΊΡΠ°. ΠΡΡΠ΅ΠΊΡ ΡΠ°ΡΡΡΠΈΡΠ°Π½ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Ρ ΠΎΡΠΎΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Π·Π°ΠΏΠΈΡΠΈ (ΡΡΠΎΠ±Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠ³ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ), Π½ΠΎ ΠΎΠΏΠ»ΠΎΡΠ°Π» Π±Ρ Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΠ» Π±Ρ ΠΊ ΡΠ΅ΡΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Β«ΡΠΈΡΠ°ΡΠ΅Π»ΡΒ». Π‘Π΅ΠΌΠ°ΡΠΎΡ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ» Π±Ρ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ»ΠΎ Π±Ρ ΠΎΡΠ»ΠΈΡΠΈΡΡ Π΄Π²Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π΄ΠΎΡΡΡΠΏΠ° β ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΌΠΎΠ³Π»ΠΎ Π±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Β«ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉΒ», Π½ΠΎ Π΅ΡΠ»ΠΈ Π±Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ Π·Π°Π²Π»Π°Π΄Π΅ΡΡ Β«ΠΏΠΈΡΠ°ΡΠ΅Π»ΡΒ», Π΅Π³ΠΎ Π²ΡΠ·ΠΎΠ² Π½ΠΈΡΠ΅ΠΌ Π±Ρ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°Π»ΡΡ ΠΎΡ Π²ΡΠ·ΠΎΠ²Π° Β«ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉΒ», ΡΡΠΎ Π²ΡΠ·Π²Π°Π»ΠΎ Π±Ρ Π½Π΅ΠΊΡΠ°ΡΠΈΠ²ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ Β«ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉΒ» ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΠΆΠ΅ Β«ΠΏΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉΒ»!
ΠΠ΄ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΠΡΡΠ³Π°Ρ ΡΠΈΠΏΠΎΠ²Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ β ΡΡΠΎ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎΡΠΎΠΊ Β«ΠΆΠ΄Π°ΡΡ ΡΠ΅Π³ΠΎ-Π»ΠΈΠ±ΠΎΒ». ΠΡΠΈΠΌ Β«ΡΠ΅ΠΌ- Π»ΠΈΠ±ΠΎΒ» ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ! ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ½Π°Ρ Π»Π΅Π½ΡΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² Π½ΡΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ Π½Π° Π΄ΠΈΡΠΊ, ΠΈ Ρ.Π΄. ΠΡΠ΅ ΠΎΠ΄Π½Π° Ρ ΠΈΡΡΠΎΡΡΡ ΡΡΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΎΠ±ΡΡΠΈΡ ΠΌΠΎΠ³ΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ ΡΠ΅Π»Π΅ΠΉ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΈΠ±ΠΎ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ (condition variable), ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ΅ΡΡ Π½ΠΈΠΆΠ΅, Π»ΠΈΠ±ΠΎ, ΡΡΠΎ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅, ΠΆΠ΄ΡΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ (sleepon).
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π½Π°Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ½Π°ΡΠ°Π»Π° Π²ΡΠ·ΠΎΠ²Ρ, Π° Π·Π°ΡΠ΅ΠΌ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
int pthread_sleepon_lock(void);
int pthread_sleepon_unlock(void);
int pthread_sleepon_broadcast(void *addr);
int pthread_sleepon_signal(void *addr);
int pthread_sleepon_wait(void *addr);
He Π΄Π°ΠΉΡΠ΅ ΠΏΡΠ΅ΡΠΈΠΊΡΡ pthread_ ΡΠ΅Π±Ρ ΠΎΠ±ΠΌΠ°Π½ΡΡΡ. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ°ΠΌΠΈ POSIX.
ΠΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ ΡΠ°Π½Π΅Π΅, ΠΏΠΎΡΠΎΠΊΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΆΠ΄Π°ΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ Π²ΡΠ±ΠΎΡ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅ ΡΠΏΠΈΡΠΊΠ° ΡΡΠ½ΠΊΡΠΈΠΉ β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ pthread_sleepon_wait(). ΠΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π°Π΄ΠΎ Π»ΠΈ ΠΆΠ΄Π°ΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΒ», ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ Π½Π΅ΠΊΠΈΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ ΡΡΠ΅Π΄ΡΡΠ². ΠΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ β ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΠΈ ΠΎΠ½ Π½Π΅ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ»:
volatile int data_ready = 0;
consumer() {
while (1) {
while (!data_ready) {
// wait
}
// ΠΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅
}
}
Β«ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Π²Π΅ΡΠ½ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ²ΠΎΠ΅ΠΌ Π³Π»Π°Π²Π½ΠΎΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ΅ΠΌ ΡΠΈΠΊΠ»Π΅ (while(1)). ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΎΠ½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ β ΡΡΠΎ ΡΠ»Π°Π³ data_ready. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΠ»Π°Π³ ΡΠ°Π²Π΅Π½ 0, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π°Π½Π½ΡΡ Π½Π΅Ρ, ΠΈ ΠΈΡ Π½Π°Π΄ΠΎ ΠΆΠ΄Π°ΡΡ. ΠΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ΄Π΅Ρ ΠΊΠ°ΠΊ-ΡΠΎ Β«ΡΠ°Π·Π±ΡΠ΄ΠΈΡΡΒ» Π΅Π³ΠΎ, ΠΈ ΡΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ»Π°Π³Π° data_ready. ΠΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎ. ΠΠΎΡΠΎΠΊ-Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ»Π°Π³Π° ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΡΠΎ ΡΠ»Π°Π³ ΡΠ°Π²Π΅Π½ 1, ΡΠΎ Π΅ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ. ΠΠΎΡΠΎΠΊ-Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΠΈΡ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ½ΠΎΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ ΠΏΠΎΡΡΡΠΏΠΈΠ»ΠΈ Π»ΠΈ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠΠ°ΠΊ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΡΠ»Π°Π³ data_ready ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎ Ρ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌΒ»? ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡΠΌΠ° ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ»Π°Π³Ρ, ΡΡΠΎΠ±Ρ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ. ΠΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΡΡΠ΅ΠΊΡΠ°, Π½ΠΎ ΡΡΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΌΡΡΠ΅ΠΊΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, ΡΠ°ΠΊ ΡΡΠΎ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π½Π΅ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ: pthread_sleepon_lock() ΠΈ pthread_sleepon_unlock(). ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌ Π½Π°Ρ ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ»:
consumer() {
while (1) {
pthread_sleepon_lock();
while (!data_ready) {
// WAIT
}
// ΠΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅
data_ready = 0;
pthread_sleepon_unlock();
}
}
ΠΠ΄Π΅ΡΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Β«ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ» ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΈ ΡΠ½ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠ»Π°Π³ data_ready, Π½Π΅ ΠΎΠΏΠ°ΡΠ°ΡΡΡ Π³ΠΎΠ½ΠΎΠΊ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ Π΅Π³ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ.
ΠΠ΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎ! Π ΠΊΠ°ΠΊ Π½Π°ΡΡΠ΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ? ΠΠ°ΠΊ ΠΌΡ ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ ΡΠ°Π½Π΅Π΅, ΡΠ°ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ pthread_sleepon_wait(). ΠΠΎΡ Π²ΡΠΎΡΠΎΠΉ while-ΡΠΈΠΊΠ»:
while (!data_ready) {
pthread_sleepon_wait(&data_ready);
}
Π€ΡΠ½ΠΊΡΠΈΡ pthread_sleepon_wait() Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
1. Π Π°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
2. ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
3. Π‘Π½ΠΎΠ²Π° Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΠ΅ΠΊΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΆΠ΄ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
ΠΡΠΈΡΠΈΠ½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ/Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΡΡΠ΅ΠΊΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΡΠΎΡΡΠ°: ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΡΡ ΠΌΡΡΠ΅ΠΊΡΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ»Π°Π³Ρ data_ready, ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊΡ-Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠ»Π°Π³ data_ready, ΠΏΠΎΠΊΠ° ΠΌΡ Π΅Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ. ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ ΡΠ»Π°Π³ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ, ΡΠΎ ΠΏΠΎΡΠΎΠΊ-Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΒ» Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π΅Π³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ Π½Π°ΠΌ ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ ! ΠΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°, ΡΡΠΎΠ±Ρ Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΡ pthread_sleepon_wait() ΠΏΠΎΡΠΎΠΊ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΠ»ΡΡ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠ»Π΅ Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡΒ».