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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 57

Автор Уильям БтивСнс

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

ΠœΡ‹ часто ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌΠΈ сСмафорами, Π½ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ это ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… цСлях. Π’ систСмной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафоров Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π½Π΅Ρ‚.

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ сСмафор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС срСдства ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΌΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ). Π’ листингС 10.1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для сравнСния этих срСдств.

Листинг 10.1. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… сСмафоров ΠΈ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

инициализация Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ;  ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ сСмафора Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ;

pthread_mutex_lock(&mutex);          sem_wait(&sem);

критичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ                  ΠΊΡ€ΠΈΡ‚ичСская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ

pthread_mutex_unlock(&mutex);        sem_post(&sem);

ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ сСмафор Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1. Π’Ρ‹Π·Π²Π°Π² sem_wait, ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора окаТСтся большС 0, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π½Π° 1. Π’Ρ‹Π·ΠΎΠ² sem_post ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с 0 Π΄ΠΎ 1 ΠΈ возобновляСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Π²Ρ‹Π·ΠΎΠ²Π΅ sem_wait для Π΄Π°Π½Π½ΠΎΠ³ΠΎ сСмафора.

Π₯отя сСмафоры ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΎΠ½ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ особСнностями: Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π», Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ значСния сСмафора ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. МоТно привСсти ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования этой особСнности для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΉ вСрсии Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 7 с двумя Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ сСмафорами. На рис. 10.3 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° схСма с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ, ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΎΠ±Ρ‰ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€, ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ, ΠΈΠ·Ρ‹ΠΌΠ°ΡŽΡ‰ΠΈΠΌ Π΅Π³ΠΎ ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Для простоты ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΡ„Π΅Ρ€ помСщаСтся Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. 

Рис. 10.3. Π—Π°Π΄Π°Ρ‡Π° производитСля ΠΈ потрСбитСля с ΠΎΠ±Ρ‰ΠΈΠΌ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ


Π’ листингС 10.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° псСвдокодС.

Листинг 10.2. ПсСвдокод для Π·Π°Π΄Π°Ρ‡ΠΈ производитСля ΠΈ потрСбитСля

Producer                                Consumer

инициализация сСмафора get Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0;

инициализация сСмафора put Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1;

for (;;) {                              for (;;) {

 sem_wait(&put);                         sem_wait(&get);

 ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΡƒΡ„Π΅Ρ€;               ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΡƒΡ„Π΅Ρ€Π΅;

 sem_post(&get);                         sem_post(&put);

}                                       }

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ put oΠ³Ρ€aΠ½ΠΈΡ‡ΠΈΠ²aeΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ помСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΎΠ±Ρ‰ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€, Π° сСмафор get управляСт ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΏΡ€ΠΈ считывании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ эта ΠΏpoΠ³Ρ€aΠΌΠΌa Π² Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ:

1. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΡƒΡ„Π΅Ρ€ ΠΈ Π΄Π²Π° сСмафора.

2. ΠŸΡƒΡΡ‚ΡŒ послС этого запускаСтся ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ. Он блокируСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ sem_wait, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСмафор get ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

3. ΠŸΠΎΡΠ»Π΅ этого запускаСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ sem_wait Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ put ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ с 1 Π΄ΠΎ 0, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π±ΡƒΡ„Π΅Ρ€. Π’Ρ‹Π·ΠΎΠ²ΠΎΠΌ sem_post Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора get увСличиваСтся с 0 Π΄ΠΎ 1. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ имССтся ΠΏΠΎΡ‚ΠΎΠΊ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ измСнСния значСния этого сСмафора, этот ΠΏΠΎΡ‚ΠΎΠΊ помСчаСтся ΠΊΠ°ΠΊ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ. Π’ этом случаС ΠΎΠ½ блокируСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ sem_wait Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ†ΠΈΠΊΠ»Π° for, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора put β€” 0. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°.

4. ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ возвращаСтся ΠΈΠ· sem_wait, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора get с 0 Π΄ΠΎ 1. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ sem_post, увСличивая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ put с 0 Π΄ΠΎ 1. Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ измСнСния значСния этого сСмафора ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ помСчаСтся ΠΊΠ°ΠΊ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΠΎΠΏΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ потрСбитСля продолТаСтся. Π’ΠΎΠ³Π΄Π° ΠΎΠ½ блокируСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ sem_wait Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ†ΠΈΠΊΠ»Π° for, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСмафор get ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

5. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ возвращаСтся ΠΈΠ· sem_wait, ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π±ΡƒΡ„Π΅Ρ€, ΠΈ всС повторяСтся.

ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ sem_post ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π»ΠΎΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ°, нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ измСнСния значСния сСмафора ΠΏΠΎΡ‚ΠΎΠΊ помСчался ΠΊΠ°ΠΊ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ. Никаких ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли вмСсто Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ sem_post ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, оТидавший измСнСния состояния сСмафора (исслСдуйтС Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² этом ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ).

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌ Ρ‚Ρ€ΠΈ Π³Π»Π°Π²Π½Ρ‹Ρ… отличия сСмафоров ΠΈ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² ΠΏΠ°Ρ€Π΅ с условными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ:

1. Π’Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ всСгда Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ установил Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ значСния сСмафора Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ осущСствляСтся ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌ Π΅Π³ΠΎ измСнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Π­Ρ‚ΠΎ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ продСмонстрировали Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

2. Π’Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, Π»ΠΈΠ±ΠΎ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ (ΠΏΠ°Ρ€Π° состояний, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌΡƒ сСмафору).

3. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ состояниС сСмафора хранится Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ значСния ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ влияниС Π½Π° процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²ΡƒΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait ΡƒΠΆΠ΅ послС этого измСнСния, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сигнала ΠΏΠΎ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² отсутствиС ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² сигнал Π±ΡƒΠ΄Π΅Ρ‚ утСрян. ВзглянитС Π½Π° листинг 10.2 ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π΅Ρ‰Π΅ Π½Π΅ Π²Ρ‹Π·Π²Π°Π» sem_wait. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ смоТСт ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π±ΡƒΡ„Π΅Ρ€, Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ sem_post для сСмафора get (увСличивая Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с 0 Π΄ΠΎ 1), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ заблокируСтся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ sem_wait для сСмафора put. Π§Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠΉΠ΄Π΅Ρ‚ Π΄ΠΎ Ρ†ΠΈΠΊΠ»Π° for ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ sem_wait для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ get, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого сСмафора с 1 Π΄ΠΎ 0, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ приступит ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ содСрТимого Π±ΡƒΡ„Π΅Ρ€Π°.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ Обосновании Posix.1 (Rationale) содСрТится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ добавлСния сСмафоров ΠΏΠΎΠΌΠΈΠΌΠΎ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: Β«Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² стандарт Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с Ρ†Π΅Π»ΡŒΡŽ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ срСдства синхронизации выполнСния процСссов; эти процСссы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ сСгмСнт памяти. Π’Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ описаны ΠΊΠ°ΠΊ срСдства синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… всСгда Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство ΠΎΠ±Ρ‰Π΅ΠΉ памяти. Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚. КаТдоС ΠΈΠ· этих ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… срСдств ΠΈΠΌΠ΅Π΅Ρ‚ свой ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³ Π·Π°Π΄Π°Ρ‡Β». Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 10.15 ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафоров-счСтчиков с ΠΆΠΈΠ²ΡƒΡ‡Π΅ΡΡ‚ΡŒΡŽ ядра трСбуСтся Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 300 строк ΠΊΠΎΠ΄Π° Π½Π° Π‘, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. НСсмотря Π½Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ примСнСния сСмафоров для синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами ΠΈ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ для синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΈ Ρ‚Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±ΠΎΠΈΡ… случаях. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π΅ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ срСдств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ΄ΠΎΠ±Π΅Π½ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

Π’Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ стандартом Posix описано Π΄Π²Π° Ρ‚ΠΈΠΏΠ° сСмафоров: ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ (named) ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π² памяти (memory-based ΠΈΠ»ΠΈ unnamed). На рис. 10.4 ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±ΠΎΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ сСмафоров.

Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор Posix Π±Ρ‹Π» ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π½Π° рис. 10.2. НСимСнованный, ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Π² памяти, сСмафор, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π½Π° рис. 10.5.

Рис. 10.4. Π’Ρ‹Π·ΠΎΠ²Ρ‹ для сСмафоров Posix


Рис. 10.5. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² ΠΎΠ±Ρ‰Π΅ΠΉ памяти Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²


На рис. 10.6 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² раздСляСмой памяти сСмафор (Ρ‡Π°ΡΡ‚ΡŒ 4), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ двумя процСссами. ΠžΠ±Ρ‰ΠΈΠΉ сСгмСнт памяти ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ адрСсному пространству ΠΎΠ±ΠΎΠΈΡ… процСссов.

Рис. 10.6. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² раздСляСмой двумя процСссами памяти


Π’ этой Π³Π»Π°Π²Π΅ сначала Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ сСмафоры Posix, Π° Π·Π°Ρ‚Π΅ΠΌ β€” Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π² памяти. ΠœΡ‹ возвращаСмся ΠΊ Π·Π°Π΄Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 7.3 ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ Π΅Π΅, позволяя нСскольким производитСлям Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ, Π° Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ нСскольким производитСлям ΠΈ нСскольким потрСбитСлям. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ мноТСствСнных Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² являСтся частным случаСм Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ.

ΠœΡ‹ рассмотрим Ρ‚Ρ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… сСмафоров Posix: с использованиСм ΠΊΠ°Π½Π°Π»ΠΎΠ² FIFO, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Ρ… Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ сСмафоров System V. 

10.2. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ sem_open, sem_close ΠΈ sem_unlink

Ѐункция sem_open создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ. Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сСмафор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для синхронизации выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов:

#include <semaphore.h>

sem_t *sem_open(const char *name, int oflag, …

 /* mode_t mode, unsigned int value */);

/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° сСмафор Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, SEM_FAILED β€” Π² случаС ошибки */

ВрСбования ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ ΠΏΠ°Ρ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.2.

АргумСнт oflag ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния 0, O_CREAT, O_CREAT | O_EXCL, ΠΊΠ°ΠΊ описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 2.3. Если ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ O_CREAT, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. АргумСнт mode ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΈΡ‚Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ доступа (Ρ‚Π°Π±Π». 2.3), a value ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСмафора. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ константу SEM_VALUE_MAX, которая, согласно Posix, Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 32767. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ сСмафоры ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² 1, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ сСмафоры-счСтчики Ρ‡Π°Ρ‰Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ большими Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ.