[EDEADLK] ΡΠ΅ΠΊΡ Ρ ΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠΆΠ΅ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ° Ρ Π°ΡΡ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ [EINTR].
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ.
ΠΡΠ΄ΡΡΠΈΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅
pthread_rwlock_destroy (), pthread_rwlock_timedrdlock (), pthread_rwlock_timedwrlock (), pthread_rwlock_trywrlock (), pthread_rwlock_unlock (), pthread_rwlock_wrlock (), ΡΠΎ ΠΌ Base Definitions crannapTalEEEStd 1003.1-2001, <pthread.h>.
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΠΈ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² Π²ΡΠΏΡΡΠΊΠ΅ Issue 5. Issue 6
ΠΠ»Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎ ΠΌ IEEE Std 1003.1j-2000 Π±ΡΠ»ΠΈ Π²Π½Π΅ΡΠ΅Π½Ρ ΡΠ»Π΅Π΄ΡΡ Ρ ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
β’Β Π ΡΠ°Π·Π΄Π΅Π»Π΅ Β«Π‘ΠΈΠ½ΠΎΠΏΡΠΈΡΒ» Π±ΡΠ»Π° ΠΈΠ· ΠΌ Π΅Π½Π΅Π½Π° ΠΌ Π΅ΡΠΊΠ°. ΠΠΎΠ²Π°Ρ ΠΌ Π΅ΡΠΊΠ° THR ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ°ΡΡ ΠΌ Π°ΡΡΠΈΠ²Π°Π΅ ΠΌ ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΡΡ ΠΎΠΏΡΠΈΠΈ Threads (ΡΠ°Π½Π΅Π΅ ΠΎΠ½ΠΈ ΠΎΡΠ½ΠΎΡΠΈΠ»ΠΈΡΡ ΠΊ ΠΎΠΏΡΠΈΠΈ Read-Write Locks ΡΡΠ°Π½Π΄Π°ΡΡΠ° IEEE Std 1003.1j-2000, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΈΡΠ°Π»ΠΈΡΡ ΡΠ°ΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ XSI).
β’Β Π Π°Π·Π΄Π΅Π» Β«ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅Β» Π±ΡΠ» ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ ΡΠ»Π΅Π΄ΡΡ Ρ ΠΈ ΠΌ ΠΎΠ±ΡΠ°Π·ΠΎ ΠΌ:
-Β Π·Π°Π΄Π°Π½Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Ρ Ρ ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΈ ΠΌ Π΅ΡΡ ΠΏΡΠ΅ΠΈ ΠΌ Ρ Ρ Π΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΡΠΈΡΡΠ²Π°Ρ Ρ ΠΈ ΠΌ ΠΈ;
-Β ΡΠ°Π·ΡΡΡΠ½Π΅Π½Π° Π²ΠΎΠ· ΠΌ ΠΎΠΆΠ½Π°Ρ ΠΏΡΠΈΡΠΈΠ½Π° Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_rwlock_tryrdlock();
-Β Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π°Π±Π·Π°Ρ, Π² ΠΊΠΎΡΠΎΡΠΎ ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ ΠΎ ΠΏΡΠΈ ΠΌ Π΅Π½Π΅Π½ΠΈΠΈ ΠΌ Π°ΠΊΡΠΈ ΠΌ Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ.
β’Β ΠΡΠ» ΠΌ ΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½ ΡΠ°Π·Π΄Π΅Π» Β«ΠΡΠΈΠ±ΠΊΠΈΒ», ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΡΠΉ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠΈ [EBUSY] : ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΏΡΠΈΠ½ΡΡΡ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π£Π΄Π°Π»Π΅Π½ Π°Π±Π·Π°Ρ, ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΡΠΉ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠΈ [EDEADLK] , Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ pthread_rwlock_tryrdlock ().
β’Β ΠΡΠ» ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ ΡΠ°Π·Π΄Π΅Π» Β«Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅Β».
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΡ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΠ°ΠΊ ΡΠΏΠΎ ΠΌ ΠΈΠ½Π°Π»ΠΎΡΡ Π² ΡΠΎ ΠΌ Π΅ Base Definitions ΡΡΠ°Π½Π΄Π°ΡΡΠ° IEEE Std 1003.1-2001 (Se c tion 3.285, Priority Inversion), ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΌ ΠΎΠ³ΡΡ ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π½ΡΡΡΡΡ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ².
pthread_rwlock_timedrdlock
ΠΠΌΡ
pthread_rwlock_timedrdlockβ ΡΡΠ½ΠΊΡΠΈΡ, Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ°Π» ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ.
Π‘ΠΈΠ½ΠΎΠΏΡΠΈΡ
THR #include <pthread.h> TMO #include <time.h>
int pthread_rwlock_timedrdlock (
pthread_rwlock_t *restrict rwlock,
const struct timespec *restrict abs_timeout);
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_timedrdlock () ΠΏΡΠΈ ΠΌ Π΅Π½ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ, Π°Π΄ΡΠ΅ΡΡΠ΅ ΠΌ ΠΎ ΠΌ Ρ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ rwlock, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_rwlock_rdlock (). ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π±Π΅Π· ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΠΎΠΊΠ° Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΡΡ Π΅Π΅, ΡΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅ΡΠ²Π°Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡΠ΅ΡΠ΅Ρ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΡΡΡΠΏΠΈΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΠ΅ ΠΌ Ρ, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ abs_timeout (Ρ.Π΅. ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ Π²ΡΠ΅ ΠΌ Π΅Π½ΠΈ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ ΠΌ ΡΡ Π² ΡΠΈΡΡΠ΅ ΠΌ Π΅ ΡΠ°ΡΠ°Ρ ΡΡΠ°Π½ΡΡ ΡΠ°Π²Π½Ρ ΠΌ ΠΈ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π²ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ abs_timeout), ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΠ΅ ΠΌ Ρ, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ abs_ timeou t, ΡΠΆΠ΅ Π½Π°ΡΡΡΠΏΠΈΠ»ΠΎ Π² ΠΌ ΠΎ ΠΌ Π΅Π½Ρ Π²ΡΠ·ΠΎΠ²Π°.
TMR ΠΡΠ»ΠΈ ΠΏΠΎ Π΄ Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠΏΡΠΈΡ Timers, ΠΎΡΡΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π²ΡΠ΅ ΠΌ Π΅Π½ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌ ΡΠ°ΡΠΎΠ² CLOCK_REALTIME.
ΠΡΠ»ΠΈ ΠΎΠΏΡΠΈΡ Timers Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ, ΠΎΡΡΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΡΠ°ΡΠΎΠ², Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ time (). Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ°ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΎΡΡΡΠ΅ΡΠ°. Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ timespec ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ <time.h>. ΠΠΈ ΠΏΡΠΈ ΠΊΠ°ΠΊΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° abs_timeout Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈ ΠΌ ΠΎΡΡΠΈ, Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΌ ΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π½Π΅ ΠΌ Π΅Π΄Π»Π΅Π½Π½ΠΎ.
ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΡ, Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΌ Ρ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_rwlock_timedrdlock(), ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠΈΠ³Π½Π°Π», ΡΠΎ ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΡΠΎΠΊ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ΠΎ ΠΈ Π½Π΅ ΠΏΡΠ΅ΡΡΠ²Π°Π»ΠΎΡΡ.
ΠΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΏΠ°ΡΡΡ Π² Π»ΠΎΠ²ΡΡΠΊΡ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π΅ΡΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ½ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΠΎΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ rwlock . Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ, Π΅ΡΠ»ΠΈ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Ρ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_timedrdlock() Π²ΠΎΠ·Π²ΡΠ° Ρ Π°Π΅Ρ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ, Π°Π΄ΡΠ΅ΡΡΠ΅ ΠΌ ΠΎ ΠΌ Ρ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ rwloc, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π°. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎ ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠΈΠΉ Π΅Π΅ Ρ Π°ΡΠ°ΠΊΡΠ΅Ρ.
ΠΡΠΈΠ±ΠΊΠΈ
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_timedrdlock () Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ:
[ETIMEDOUT] Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ ΠΌ ΠΎΠ³Π»Π° Π±ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π΄ΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° Π΄ Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π²ΡΠ΅ ΠΌ Π΅Π½ΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_timedrdlock () ΠΌ ΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅Ρ Π΄ Π°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ:
[EAGAIN] Β Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄ Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π½Π΅ ΠΌ ΠΎΠ³Π»Π° Π±ΡΡΡ ΠΏΡΠ΅ Π΄ ΠΎΡΡΠ°Π²Π»Π΅Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ
ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΎ ΠΌ Π°ΠΊΡΠΈ ΠΌ Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΠ³Ρ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΠΎΠΌΡ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ rwlock
[EDEADLK] Β Π²ΡΠ·ΡΠ²Π°Ρ Ρ ΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠΆΠ΅ Ρ Π΄ Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΠΎΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ rwlockr,
[EINVAL] Β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ rwlock, Π½Π΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ, ΠΈΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ abs_timeout, Π²ΡΡΠ°ΠΆΠ΅Π½Π½ΠΎΠ΅ Π² Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄Π°Ρ , ΠΌΠ΅Π½ΡΡΠ΅ Π½ΡΠ»Ρ Π»ΠΈΠ±ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π²Π½ΠΎ 1000 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°ΠΌ.
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ [EINTR].
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΡ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΠ°ΠΊ ΡΠΏΠΎ ΠΌ ΠΈΠ½Π°Π»ΠΎΡΡ Π² ΡΠΎ ΠΌ Π΅ Base Definitions ΡΡΠ°Π½ Π΄ Π°ΡΡΠ° IEEE Std 1003.1-2001 (Section 3.285, Priority Inversion), ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΌΠΎΠ³ΡΡ ΠΏΠΎ Π΄ Π²Π΅ΡΠ³Π½ΡΡΡΡΡ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ².
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_timedrdlock() ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΠΎΠΏΡΠΈΠΉ Threads ΠΈ Timeouts ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ ΠΏΡΠ΅ Π΄ ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π²ΠΎ Π²ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ .
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ.
ΠΡΠ΄ΡΡΠΈΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅
pthread_rwlock_destroy(), pthread_rwlock_rdlock(), pthread_rwlock_timedwrlock(), pthread_rwlock_tryrdlock(), pthread_rwlock_trywrlock(), pthread_rwlock_unlock(), pthread_rwlock_wrlock (), ΡΠΎ ΠΌ Base Definitions ΡΡΠ°Π½Π΄Π°ΡΡΠ° IEEE Std 1003.1-2001, <pthread.h>, <time.h>.
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Π²ΡΠΏΡΡΠΊΠ΅ Issue 6, ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌ ΠΏΠΎΡΠ»ΡΠΆΠΈΠ» ΡΡΠ°Π½Π΄Π°ΡΡ IEEEStd 1003.1j-2000.
pthread_rwlock_timedwrlock
ΠΠΌΡ
pthread_rwlock_timedwrlock β ΡΡΠ½ΠΊΡΠΈΡ, Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ°Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ.
Π‘ΠΈΠ½ΠΎΠΏΡΠΈΡ
THR TMO
#include <pthread.h>
#include <time.h>
int pthread_rwlock_timedwrlock (
pthread_rwlock_t *restrict rwlock,
const struct timespec *restrict abs_timeout);
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_timedwrlock () ΠΏΡΠΈ ΠΌ Π΅Π½ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΠΎΠΌΡ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ rwlock, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_rwlock_wrlock (). ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ ΠΌ ΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π±Π΅Π· ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΠΎΠΊΠ° Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΡΡ Π΅Π΅, ΡΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅ΡΠ²Π°Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡΠ΅ΡΠ΅Ρ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ ΠΌ Π΅Π½ΠΈ. ΠΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ ΠΌ Π΅Π½ΠΈ ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΡΡΡΠΏΠΈΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΠ΅ ΠΌ Ρ, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ abs_timeout (Ρ.Π΅. ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠ°ΡΠ°Ρ ΡΡΠ°Π½ΡΡ ΡΠ°Π²Π½ΡΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π²ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ abs_timeout), ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΠ΅ ΠΌ Ρ, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ abs_timeout, ΡΠΆΠ΅ Π½Π°ΡΡΡΠΏΠΈΠ»ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ·ΠΎΠ²Π°.