ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ
ΠΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ Π²ΡΡΠ΅, ΠΊ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ. ΠΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°, P(), ΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°, V(). ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Mutex ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΡΠΎ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ P (Mutex) ΠΈ V (Mutex) ΠΌ ΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊΠΈ ΠΌ ΠΎΠ±ΡΠ°Π·ΠΎ ΠΌ:
P(Mutex)
if (Mutex > 0) {
Mutex--;
} else {
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ Mutex;
}
V(Mutex)
if(OΡepeΠ΄Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Mutex Π½Π΅ ΠΏΡΡΡΠ°){
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΡΡΡΠ΅ΠΊΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠ΅;
} else {
Mutex++;
}
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ ΠΌ Ρ. ΠΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅Π΄Π΅Π»ΠΈΠΌΡ, Ρ.Π΅. ΠΈΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅ΡΠ²Π°ΡΡ. ΠΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ P () ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π΄Π°Ρ, ΡΠΎ Π»ΠΈΡΡ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Mutex Π±ΡΠ» ΡΠΆΠ΅ Π΄Π΅ΠΊΡΠ΅ ΠΌ Π΅Π½ΡΠΈΡΠΎΠ²Π°Π½, ΡΠΎ Π·Π°Π΄Π°ΡΠ° Π±ΡΠ΄Π΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π° ΠΈ Π·Π°ΠΉ ΠΌ Π΅Ρ ΠΌ Π΅ΡΡΠΎ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΠΏΠ΅ΡΠ°ΡΠΈ Ρ V () Π²ΡΠ·ΡΠ²Π°Π΅ΡΡ Ρ Π·Π°Π΄Π°ΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈ ΠΌ Π΅Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Mutex. ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΡΡΡΠ΅ΠΊΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π΄ΡΡ Π³ ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΎΠ½ Β«ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Β» ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠ΅ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΡΠ»ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π·Π°Π΄Π°Ρ ΠΏΡΡΡΠ°, ΠΎΠ±ΡΠ΅ΠΊΡ Mutex ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΡΡ Ρ.
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°:
ΠΠΏΠ΅ΡΠ°ΡΠΈ Ρ P(): lock()
ΠΠΏΠ΅ΡΠ°ΡΠΈ Ρ V(): unlock()
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π΅Π³ΠΎ ΡΠΈΠΏΠ°. ΠΠ²ΠΎΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0 ΠΈΠ»ΠΈ 1. ΠΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ (ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ Ρ ΠΈΠΉ Π»ΠΈΠΌΠΈΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² Π΄Π»Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½ΠΈΠΌ) ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
Π‘ΡΠ°Π½Π΄Π°ΡΡ POSIX ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏΠΎΠ² ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ². ΠΡΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ ΠΈΡΠΏΠΎ Π» ΡΠ·ΡΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. Π’ΠΈΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² (Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ) ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΡΠ°Π±Π». 5.1.
Π’Π°Π±Π»ΠΈΡΠ° 5 .1. Π’ΠΈΠΏΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ POSIX
Π’ΠΈΠΏ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΡΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ
ΠΡΠΎΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΊΠΎΠ΄Π°
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ
ΠΡΠΎΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄
Π»
Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ° Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΡΡΠ΅Π΄ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²
Π£ΡΠ»ΠΎΠ²Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
ΠΡΠΎΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄
Π»
Ρ ΡΠ²Π΅Π΄ΠΎΠΌ
Π»
Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡ
Π»
ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅.
Π‘ΠΎΠ±ΡΡΠΈΠΉΠ½ΡΠΉ ΠΌΡΡΡΠ΅ΠΊΡ ΠΎΡΡΠ°Π΅ΡΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠΈΠ³Π½Π°Π»
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΡΠΎΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΡΠΎΠ±ΡΡΠΈΠΉΠ½ΠΎΠΌΡ ΠΌΡΡΡΠ΅ΠΊΡΡ, Π½ΠΎ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈΠ»ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΉ
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠ°Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Single UNIX Specification ΠΈΠ»ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΡ POSIX Standard, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ libpthread (ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ pthread. h).
ΠΡΡΡΠ΅ΠΊΡΠ½ΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ
Π‘ΡΠ°Π½Π΄Π°ΡΡ POSIX ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΡΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° pthread_mutex_t. ΠΡΠΎΡ ΠΌΡΡΡΠ΅ΠΊΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ:
β’Β ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ;
β’Β Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅;
β’Β ΠΎΡΠΊΠ°Π· ΠΎΡ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ;
β’Β ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ;
β’Β ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΠ΅.
Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° pthread_mutex_t, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΡΠ°Π±Π». 5.2. ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΠΌΡΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°, ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠ»Ρ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π½Π°ΡΠ°Π»ΡΠ½ΡΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0 ΠΈΠ»ΠΈ 1. ΠΠ°ΡΠ°Π»ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ΅ΡΡΡΡΠ½ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡ. Π‘Π΅ΠΌΠ°ΡΠΎΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅Π°Π½ΡΠ΅. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΠ±ΡΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , Π² ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠΌΠ½Π΅Π²Π°ΡΡΡΡ Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ, ΡΠ°ΠΊΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π§ΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡΡΡΠ΅ΠΊΡ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΠ½ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΌΡΡΡΠ΅ΠΊΡ-Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΈΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ errno). Π‘ΠΈΡΡΠ΅ΠΌΠ΅ Π½Π΅ ΡΠ΄Π°ΡΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π·Π°Π½ΡΡΠ° ΠΏΠ°ΠΌΡΡΡ, ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π½Π°Ρ ΡΠ°Π½Π΅Π΅ Π΄Π»Ρ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ², ΠΈΠ»ΠΈ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ², ΠΈΠ»ΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡ Ρ Π΄Π°Π½Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠΎ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ Π΄ΡΡΠ³Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ.
Π’Π°Π±Π»ΠΈΡΠ° 5.2. Π€Ρ Π½ ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° pthread_mutex_t
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ int pthread_mutex_init( pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;
ΠΠ°ΠΏΡΠΎΡ Π½Π° ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ #include <pthread.h>
<time.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,
const struct timespec *restrict abs_timeout);
ΠΡΠΊΠ°Π· ΠΎΡ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎ Π²Π°Π½ΠΈΡ int pthread_mutex_unlock(pthread_mutex_t *mutex);
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎ Π³ ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ int pthread_mutex_trylock(pthread_mutex_t *mutex);
Π Π°Π·ΡΡΡΠ΅Π½ΠΈΠ΅ int pthread_mutex_destroy(
pthread_mutex_t *mutex);
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ, ΠΌΡΡΡΠ΅ΠΊΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Pthread ΠΈΠΌΠ΅Π΅Ρ Π°ΡΡΠΈΠ±ΡΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ (ΠΎΠ½ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ Π½ΠΈΠΆΠ΅), ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ Π²ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ ΠΌΡΡΡΠ΅ΠΊΡΠ°. ΠΡΠΎΡ Π°ΡΡΠΈΠ±ΡΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΠΌΡΡΡΠ΅ΠΊΡ Ρ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ, Π·Π°Π΄Π°Π½Π½ΡΠΌΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΡΠ»ΠΈ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π°ΡΡΠΈΠ±ΡΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΌΡΡΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π΄Π΅ΠΉΡΡΠ²ΡΡ Ρ ΠΈΠΌΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° pthread_mutex_t ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π΄Π΅Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈ Π·Π°ΠΊΡΡΡΡΠΉ. ΠΠ°ΠΊΡΡΡΡΠΉ ΠΌΡΡΡΠ΅ΠΊΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎ Π³ ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. Π Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠΉ ΠΌΡΡΡΠ΅ΠΊΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π°ΡΡΠΈΠ±ΡΡΠΎΠ², Π΄Π΅ΠΉΡΡΠ²ΡΡ Ρ ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΌΡΡΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄Π»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΌΠ°ΠΊΡΠΎΡΠ°:
pthread_mutex_t Mutex = PTHREAD_MUTEX_INITIALIZER; [11]
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΡΡΠ°ΡΠ½ΡΠΉ, Π½ΠΎ Π² Π½Π΅ΠΌ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΡΡΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ°. ΠΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠ°Π²ΠΎ Π²Π»Π°Π΄Π΅Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡΡΡΠ΅ΠΊΡ ΠΎΠ±ΡΠ΅Π» Π²Π»Π°Π΄Π΅Π»ΡΡΠ°, ΠΏΠΎΡΠΎΠΊ (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ) ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ. ΠΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π·Π°Π²Π»Π°Π΄Π΅ΡΡ Β«ΡΠΆΠ΅ Π·Π°Π½ΡΡΡΠΌΒ» ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ (ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ), ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ Π»ΡΠ±ΡΠΌΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΌΡΡΡΠ΅ΠΊΡ Π½Π΅ ΡΡΠ°Π½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ. ΠΡΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ (ΠΏΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ) ΠΏΠΎΡΠΎΠΊ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ (ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½) Π΄Π΅Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠ°Π²ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ Π½Π° ΡΡΠΎΡ ΠΌΡΡΡΠ΅ΠΊΡ. Π ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊ, ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉ Π΄Π°Π½Π½ΡΠΉ ΠΌΡΡΡΠ΅ΠΊΡ Π²ΠΎ Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_mutex_lock(). ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΌΡΡΡΠ΅ΠΊΡ Π½Π΅ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½, ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠ»ΠΈ ΠΌΡΡΡΠ΅ΠΊΡ Π·Π° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡΡ, ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.