Π Π°Π·ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ²
ΠΡΡΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·ΡΡΡΠΈΡΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄.
struct obj {
pthread_mutex_t om;
int refcnt;
};
obj_done (struct obj *op) {
pthread_mutex_lock (&op- >om);
if (βop- >refcnt == 0) {
pthread_mutex_unlock (&op- >om);
(A)Β pthread_mutex_destroy (&op- >om);
(B)Β free(op); } else
(Π‘) pthread_mutex_unlock (&op->om);
}
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΡΡΠΊΡΡΡΠ° obj ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΡΡΠ΅ΡΠ° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΡΡΠ»ΠΎΠΊ, Π° ΡΡΠ½ΠΊΡΠΈΡ obj_done() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡΡ ΠΈΠΌ ΡΠ΅ΡΡΡΡΠΎΠ² (ΡΠΌ. ΡΡΡΠΎΠΊΠΈ Π ΠΈ Π) ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (ΡΡΡΠΎΠΊΠ° Π‘).
ΠΡΠ΄ΡΡΠΈΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅
pthread_mutex_getprioceiling (), pthread_mutex_lock (), pthread_mutex_timedlock (), pthread_mutexattr_getpshared (), ΡΠΎΠΌ Base Definitions ΡΡΠ°Π½Π΄Π°ΡΡΠ° IEEE Std 1003.1-2001, <pthread.h>.
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΠΈ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² Π²ΡΠΏΡΡΠΊΠ΅ Issue 5. ΠΠΊΠ»ΡΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌ POSIX Threads Extension.
Issue 6
Π€ΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_destroy() ΠΈ pthread_mutex_init() ΠΎΡ ΠΌ Π΅ΡΠ΅Π½Ρ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ ΠΎΠΏΡΠΈΠΈ Threads.
Π ΡΠ΅Π»ΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎ ΠΌ IEEE Std 1003.1d-1999 Π² ΡΠ°Π·Π΄Π΅Π» Β«Π‘ ΠΌ ΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅Β» Π±ΡΠ»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ pthread_mutex_timedlock ().
Π Π°Π·Π΄Π΅Π» Β«ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅Β» Π± Ρ Π» ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ ΠΏΡΡΠ΅ ΠΌ ΠΏΡΠΈ ΠΌ Π΅Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΠΈ IEEE PASC Interpretation 1003.1Ρ #34.
Π ΡΠ΅Π»ΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ ISO/IEC 9899: 1999 Π² ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_init () Π±ΡΠ»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ restrict.
pthread_mutex_getprioceiling, pthread_mutex_setprioceiling
ΠΠΌΡ
THR TPP
pthread_mutex_getprioceiling, pthread_mutex_setprioceiling β ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΌΡΡΡΠ΅ΠΊΡΠ° (REALTIME THREADS).
Π‘ΠΈΠ½ΠΎΠΏΡΠΈΡ
#include <pthread.h>
int pthread_mutex_getprioceiling (
const pthread_mutex_t *restrict mutex, int *restrict prioceiling) ; int pthread_mutex_setprioceiling (
pthread_mutex_t *restrict mutex, int prioceiling, int *restrict old_ceiling) ;
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π€ΡΠ½ΠΊΡΠΈΡ pthread_mutex_getprioceiling() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠ΅ΠΊΡ Ρ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΌ ΡΡΡΠ΅ΠΊΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ pthread_mutex_setprioceiling() ΡΠ½Π°ΡΠ°Π»Π° Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌ ΡΡΡΠ΅ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΈΠ»ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π² Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, Π° Π·Π°ΡΠ΅ ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΌΡΡΡΠ΅ΠΊΡΠ° ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π΅Π³ΠΎ. ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° Π΅Π³ΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° old__ceiling. Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ° Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΊ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ Π·Π° Ρ ΠΈΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°.
ΠΡΠΈ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_setprioceiling() ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΌΡΡΡΠ΅ΠΊΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_getprioceiling() ΠΈ pthread_mutex_setprioceiling() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ β ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠΈΠΉ Π΅Π΅ Ρ Π°ΡΠ°ΠΊΡΠ΅Ρ.
ΠΡΠΈΠ±ΠΊΠΈ
Π€ΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_getprioceiling () ΠΈ pthread_mutex_setprioceiling () ΠΌΠΎΠ³ΡΡ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ:
[EINVAL] Β ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ, Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ prioceiling, Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² Π½ΡΠΆΠ½ΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½:
[EINVAL] Β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ mutex, Π½Π΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ Π½ΠΈ ΠΊ ΠΎΠ΄Π½ΠΎ ΠΌ Ρ ΠΈΠ· ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ²;
[ EPERM] Β ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡ Π²ΡΠ·ΠΎΠ²Π° Π½Π΅ ΠΈ ΠΌ Π΅Π΅Ρ ΠΏΡΠΈΠ²ΠΈΠ»Π΅ Π³ ΠΈΠΉ Π΄ Π» Ρ Π²ΡΠΏΠΎ Π» Π½Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ° Ρ Π°ΡΡ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ [EINTR].
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΡ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ.
ΠΡΠ΄ΡΡΠΈΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅
pthread_mutex_destroy(),pthread_mutex_lock(),
pthread_mutex_timedlock (), ΡΠΎ ΠΌ Base Definitions ΡΡΠ°Π½Π΄Π°ΡΡΠ° IEEE Std 1003.1-2001, <pthread.h>.
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΠΈ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² Π²ΡΠΏΡΡΠΊΠ΅ Issue 5. ΠΠΊΠ»ΡΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ POSIX Threads Extension.
ΠΡΠΌΠ΅ΡΠ΅Π½Ρ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ Π³ΡΡΠΏΠΏΡ Realtime Threads Feature Group.
Issue 6
Π€ΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_getprioceiling () ΠΈ pthread_mutex_setprioceiling () ΠΎΡΠΌΠ΅ΡΠ΅Π½Ρ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ ΠΎΠΏΡΠΈΠΉ Threads ΠΈ Thread Execution Scheduling.
ΠΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ [ENOSYS] Π±ΡΠ» ΠΈΡΠΊΠ»ΡΡΠ΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΅Π³ΠΎ Π½Π΅Ρ ΡΠΌΡΡΠ»Π° ΡΡΠΈΡΡΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠΏΡΠΈΡ Thread Priority Protection.
ΠΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ [ENOSYS], ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠΈΠΉ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΡΡΠ΅ΡΠ° ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° Π΄Π»Ρ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ², Π±ΡΠ» ΠΈΡΠΊΠ»ΡΡΠ΅Π½. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ _POSIX_PTHREAD_PRIO_PROTECT), ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅Β», Ρ.Π΅. ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΡΠ΅ΡΠ° ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° Π΄Π»Ρ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ.
Π ΡΠ΅Π»ΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ IEEE Std 1003.1d-1999 Π² ΡΠ°Π·Π΄Π΅Π» Β«Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ pthread_mutex_timedlock ().
Π ΡΠ΅Π»ΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ ISO/IEC 9899: 1999 Π² ΠΏΡΠΎΡΠΎΡΠΈΠΏΡ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_getprioceiling() ΠΈ pthread_mutex_setprioceiling() Π±ΡΠ»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ restrict.
pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock
ΠΠΌΡ
pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock β ΡΡΠ½ΠΊΡΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠ°.
Π‘ΠΈΠ½ΠΎΠΏΡΠΈΡ
THR #include <pthread.h>
int pthread_mutex_lock (pthread_mutex_t *.mutex) ; int pthread_mutex_trylock (pthread_mutex_t *mutex); int pthread_mutex_unlock (pthread_mutex_t *mutex);
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΠ±ΡΠ΅ΠΊΡ ΠΌΡΡΡΠ΅ΠΊΡΠ°, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ mutex, Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_lock(). ΠΡΠ»ΠΈ ΠΌΡΡΡΠ΅ΠΊΡ ΡΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΌΡΡΡΠ΅ΠΊΡ Π½Π΅ ΡΡΠ°Π½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ. ΠΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΡΡΡΠ΅ΠΊΡΠ°, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ mutex, Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π° Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΅Π³ΠΎ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ.
XSI Β ΠΡ Π» ΠΈ ΠΌ ΡΡΡΠ΅ΠΊΡ ΠΈ ΠΌ Π΅Π΅Ρ ΡΠΈΠΏ PTHREAD_MUTEX_NORMAL , ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ. Π Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ° Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ero ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ.
ΠΠ»Ρ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ² ΡΠΈΠΏΠ° PTHREAD_MUTEX_ERRORCHECK ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΡΠ»ΠΈ ΠΌΡΡΡΠ΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ PTHREAD_MUTEX_RECURSIVE, ΠΌΡΡΡΠ΅ΠΊΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ. ΠΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠ° ΡΡΠ΅ΡΡΠΈΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅. ΠΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΡΡΡΠ΅ΠΊΡΠ° ΡΡΠ΅ΡΡΠΈΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΡΡΡ, Π° ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ β Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΡΡΡ. ΠΠΎΠ³Π΄Π° ΡΡΠ΅ΡΡΠΈΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ Π½ΡΠ»Π΅Π²ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΌΡΡΡΠ΅ΠΊΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΡΠ»ΠΈ ΠΌ ΡΡΡΠ΅ΠΊΡ ΠΈ ΠΌ Π΅Π΅Ρ ΡΠΈΠΏ PTHREAD_MUTEX_DEFAULT, ΠΏΠΎΠΏΡΡΠΊΠ° ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ. ΠΠΎΠΏΡΡΠΊΠ° ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π±ΡΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ (Π»ΡΠ±ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, Π²ΠΊΠ»ΡΡΠ°Π» Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ), ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.