Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈ распрСдСлСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 54

Автор Π₯ьюз ΠšΠ°ΠΌΠ΅Ρ€ΠΎΠ½

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ сСмафором

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, ΠΊ сСмафору ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π­Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°, 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(). МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ этом случаС, Ссли ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ нСсвободСн, Ρ‚ΠΎ процСсс ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Если ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π·Π° это врСмя Π½Π΅ освободится, Ρ‚ΠΎ процСсс ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.