ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ИспользованиС сСмафоров для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Рассмотрим срСдства синхронизации Win32 АРI, основанныС ΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ систСмы с Π΄Π΅ΡΠΊΡ€ΠΈΠΏΡ‚ΠΎΡ€Π°ΠΌΠΈ. Для всСх Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² организация оТидания сводится ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π½ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ управлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ дСскриптор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΈΠ»ΠΈ массив дСскрипторов) ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, Π½Π΅ ΡΠΎΡΡ‚ΠΎΡΠ»Π°ΡΡŒ Π»ΠΈ сигнализация этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. УсловиС сигнализации зависит ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ИспользованиС сСмафоров для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π‘Π•ΠœΠΠ€ΠžΠ Π«

Одним ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… для синхронизации повСдСния процСссов, стали сСмафоры, ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… описал ДСйкстра (Dijkstra) Π² 1965 Π³ΠΎΠ΄Ρƒ. Он ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния. Π’Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для синхронизации Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссов, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСмафоров.

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для Π½Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ отсчСта. Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€Π°Π²Π° владСния эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ оТидания), счСтчик Π² ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. И Π²ΡΡΠΊΠΈΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ уступаСт свои ΠΏΡ€Π°Π²Π° владСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ владСния этим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, счСтчик Π² ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π΅ увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ счСтчик Π² ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π΅ достигнСт нуля, сСмафор блокируСтся Π² Π½Π΅ΡΠΈΠ³Π½Π°Π»ΡŒΠ½ΠΎΠΌ состоянии ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π°ΠΌΠΈ вводятся Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅ΠΌΡ‹Ρ… Π  (ΠΎΡ‚ Π΄Π°Ρ‚ского слова proberen — ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ) ΠΈ V (ΠΎΡ‚ verhogen ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ). ΠŸΡƒΡΡ‚ΡŒ пСрСмСнная S ΠΏΡ€Π΅Π΄ΡΡ‚авляСт собой сСмафор. Π’ΠΎΠ³Π΄Π° классичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ дСйствия V (S) ΠΈ P (S) ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

P (S):

Π•Π‘Π›Π˜ S = 0

ВО ΠΏΡ€ΠΎΡ†Π΅ΡΡ блокируСтся;

Π˜ΠΠΠ§Π• S = S — 1;

V (S):

S = S + 1;

Π­Ρ‚Π° запись ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

— ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ P Π½Π°Π΄ сСмафором S ΡΠ½Π°Ρ‡Π°Π»Π° провСряСтся Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если ΠΎΠ½ΠΎ большС 0, Ρ‚ΠΎ ΠΈΠ· S Π²Ρ‹Ρ‡ΠΈΡ‚аСтся 1.

Если ΠΎΠ½ΠΎ мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ 0, Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅ΡΡ блокируСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° S Π½Π΅ ΡΡ‚Π°Π½Π΅Ρ‚ большС 0, послС Ρ‡Π΅Π³ΠΎ ΠΈΠ· S Π²Ρ‹Ρ‡ΠΈΡ‚аСтся 1. УспСшная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅Π΄Π΅Π»ΠΈΠΌΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.

— ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ V Π½Π°Π΄ сСмафором S ΠΊ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ просто прибавляСтся 1. Π’ΠΎ Π²Ρ€Π΅ΠΌΡ выполнСния этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S Π½Π΅Ρ‚ доступа Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ.

НикакиС прСрывания Π²ΠΎ Π²Ρ€Π΅ΠΌΡ выполнСния ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² V ΠΈ Π  Π½Π΅Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡ‹.

Одной ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствия процСссов с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ сСмафоров, являСтся Π·Π°Π΄Π°Ρ‡Π° producer-consumer (ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ).

НапримСр. ΠŸΡƒΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΡƒΠ» состоит ΠΈΠ· N Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ запись.

ΠŸΠΎΡ‚ΠΎΠΊ-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ осущСствляСт запись Π² Π±ΡƒΡ„Π΅Ρ€, Π° ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ — Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ скорости ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠΌΡƒ ΠΏΡƒΠ»Ρƒ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π½ΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒΡŽ, Π’ ΠΎΠ΄ΠΈΠ½ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ записи ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ чтСния, Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ — Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

Для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ совмСстной Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° всС Π±ΡƒΡ„Π΅Ρ€Ρ‹ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ занятыми, ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ освобоТдСнии хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°. Напротив, ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° всС Π±ΡƒΡ„Π΅Ρ€Ρ‹ пусты, ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ появлСнии Ρ…ΠΎΡ‚ΠΈ Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠΉ записи.

Π’Π²Π΅Π΄Π΅ΠΌ Π΄Π²Π° сСмафора: Π΅ — число пустых Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², ΠΈ f — число Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ состоянии Π΅ = N, a f = 0. Π’ΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с ΠΎΠ±Ρ‰ΠΈΠΌ Π±ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΌ ΠΏΡƒΠ»ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ описана ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (рис.1).

ΠŸΠΎΡ‚ΠΎΠΊ-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π  (Π΅), с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π»ΠΈ Π² Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠΌ ΠΏΡƒΠ»Π΅ Π½Π΅Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹. Π’ ΡΠΎΠΎΡ‚вСтствии с ΡΠ΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π , Ссли сСмафор Π΅ Ρ€Π°Π²Π΅Π½ 0 (Ρ‚.Π΅. свободных Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅Ρ‚), Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ-ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠΎΡΡ‚ояниС оТидания.

Если ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число, Ρ‚ΠΎ ΠΎΠ½ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ число свободных Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², записываСт Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ свободный Π±ΡƒΡ„Π΅Ρ€ ΠΈ ΠΏΠΎΡΠ»Π΅ этого Π½Π°Ρ€Π°Ρ‰ΠΈΠ²Π°Π΅Ρ‚ число занятых Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ V (f). ΠŸΠΎΡ‚ΠΎΠΊ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ дСйствуСт Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с Ρ‚ΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚ Ρƒ Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², Π° ΠΏΠΎΡΠ»Π΅ чтСния Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°Ρ€Π°Ρ‰ΠΈΠ²Π°Π΅Ρ‚ количСство свободных Π±ΡƒΡ„Π΅Ρ€ΠΎΠ².

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΡΠΈΠ³Π½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΈΠ»ΠΈ нСсигнальном состоянии. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ выполняСт ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ для сСмафора ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠ°ΠΊ WaitForSingleObject () ΠΈΠ»ΠΈ WaitForMultipleObject ().

Рассмотрим срСдства синхронизации Win32 АРI, основанныС ΠΏΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ систСмы с Π΄Π΅ΡΠΊΡ€ΠΈΠΏΡ‚ΠΎΡ€Π°ΠΌΠΈ. Для всСх Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² организация оТидания сводится ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π½ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ управлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ дСскриптор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΈΠ»ΠΈ массив дСскрипторов) ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚, Π½Π΅ ΡΠΎΡΡ‚ΠΎΡΠ»Π°ΡΡŒ Π»ΠΈ сигнализация этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. УсловиС сигнализации зависит ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° синхронизации.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ нСвыполнСния условия сигнализации ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠΎΡΡ‚ояниС оТидания, тратя ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ рСсурсов (процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅), Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° сигнализация всС-Ρ‚Π°ΠΊΠΈ Π½Π΅ ΡΠΎΡΡ‚оится ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΌΠΈΠ½ΡƒΠ΅Ρ‚ максимальноС врСмя оТидания, Ссли ΠΎΠ½ Π±Ρ‹Π» Π·Π°Π΄Π°Π½.

Когда сигнализация ΡΠΎΡΡ‚ΠΎΡΠ»Π°ΡΡŒ, ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· ΡΠΎΡΡ‚ояния оТидания (ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания) ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Ѐункция оТидания Π² ΡΡ‚ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ).

Для оТидания сигнализации ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρƒ Win32 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForSingleQbject (), синтаксис ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

DWORD WaitForSingleObject (HANDLE handle, DWORD timeout);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

handle — опрСдСляСт дСскриптор синхронизированного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

timeout — Π·Π°Π΄Π°Π΅Ρ‚ максимальноС врСмя оТидания Π² ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡƒΠ½Π΄Π°Ρ… (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INFINITE ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ).

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: Ѐункция WaitForSingleObject () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ значСния: WAIT_OBJECT0 — ΡΠΎΡΡ‚ΠΎΡΠ»Π°ΡΡŒ сигнализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°; WAIT_TIMEOUT — ΠΌΠΈΠ½ΡƒΠ»ΠΎ врСмя оТидания (Ссли timeout Π½Π΅ Ρ€Π°Π²Π½ΡΠ»ΡΡ INFINITE), Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ своСго состояния Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ».

МоТно ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ сигнализации Π½Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сразу (Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π½Π°Π»ΠΎΠ³ использования Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… условий оТидания для условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ). Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForMultipleObjects ():

DWORD WaitForMultipleObjects (DWORD count, CONST HANDLE handles, BOOL waitall, DWORD timeout);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

count — Π΄Π»ΠΈΠ½Π° массива дСскрипторов;

handles — Π·Π°Π΄Π°Π΅Ρ‚ максимальноС врСмя оТидания Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡƒΠ½Π΄Π°Ρ… (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INFINITE ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ).

waitall — Ρ„Π»Π°ΠΆΠΎΠΊ Ρ€Π΅ΠΆΠΈΠΌΠ° оТидания;

timeout — аналогичная ΠΊ WaitForSingleObject

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

Ѐункция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ массив дСскрипторов handles Π΄Π»ΠΈΠ½ΠΎΠΉ count (максимальная Π΄Π»ΠΈΠ½Π° массива 64 элСмСнта). Π Π΅ΠΆΠΈΠΌ оТидания ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ„Π»Π°ΠΆΠΊΠ° waitall.

— Π•ΡΠ»ΠΈ waitall равняСтся TRUE, Π·Π°Π΄Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ оТидания всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ОТиданиС Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π² ΡΠ»ΡƒΡ‡Π°Π΅ осущСствлСния сигнализации всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², функция ΠΏΠΎΠ²Π΅Ρ€Π½Π΅Ρ‚ WAIT_OBJECT0.

— Π•ΡΠ»ΠΈ waitall равняСтся FALSE, Π·Π°Π΄Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ оТидания ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ОТиданиС Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π² ΡΠ»ΡƒΡ‡Π°Π΅ осущСствлСния сигнализации хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², функция ΠΏΠΎΠ²Π΅Ρ€Π½Π΅Ρ‚ WAIT_OBJECT0+i, Π³Π΄Π΅ iиндСкс дСскриптора этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ handles.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π°ΠΌ, Ссли ΠΎΠ½ Π½Π°Ρ…одится Π² Π½Π΅ΡΠΈΠ³Π½Π°Π»ΡŒΠ½ΠΎΠΌ состоянии, Π·Π°Π΄Π°Ρ‡Π°, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ°Ρ для Π½Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForSingleObject (), находится Π² ΡΠΎΡΡ‚оянии оТидания. Когда ΠΆΠ΅ состояниС сСмафора становится ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΌ, Ρ€Π°Π±ΠΎΡ‚Π° Π·Π°Π΄Π°Ρ‡ΠΈ возобновляСтся.

Π‘ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ сСмафором связываСтся счСтчик, Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ создании сСмафора. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого счСтчика ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ для сСмафора Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForSingleObject () ΠΈΠ»ΠΈ WaitForMultipleObject (), ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReleaseSemaphore ().

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика сСмафора Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, ΠΎΠ½ Π½Π°Ρ…одится Π² Π½Π΅ΡΠΈΠ³Π½Π°Π»ΡŒΠ½ΠΎΠΌ состоянии. Если ΠΆΠ΅ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ большС нуля, сСмафор ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΠΈΠ³Π½Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС.

НапримСр. ΠŸΡƒΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ создало сСмафор, ΡƒΠΊΠ°Π·Π°Π² для Π½Π΅Π³ΠΎ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика, Ρ€Π°Π²Π½ΠΎΠ΅ Ρ‚Ρ€Π΅ΠΌ. ΠŸΡƒΡΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого счСтчика Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ Ρ‚Ρ€Π΅ΠΌ.

Если Π² ΡΡ‚ΠΎΠΉ ситуации нСсколько запускаСмых ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π·Π°Π΄Π°Ρ‡ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitForSingleObject () ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ сСмафора, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π° Π²ΡΠ΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΡƒΡ‚ Π² ΡΠΎΡΡ‚ояниС оТидания.

Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitForSingleObject () ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ значСния счСтчика сСмафора Π΄ΠΎ Π½ΡƒΠ»Ρ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ сСмафор ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ Π² Π½Π΅ΡΠΈΠ³Π½Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС.

Π—Π°Π΄Π°Ρ‡Π°, запущСнная Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ, Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForSingleObject () для Π½Π΅ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ сСмафора, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, Π·Π°Π΄Π°Ρ‡ΠΈ, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ послС запуска Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ для Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ сСмафора.

Как Π΄ΠΎΠ»Π³ΠΎ продлится ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅?

Π”ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‚Ρ€Π΅Ρ… Π·Π°Π΄Π°Ρ‡ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ сСмафор, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ² Π΅Π³ΠΎ счСтчик Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReleaseSemaphore (). Π‘Ρ€Π°Π·Ρƒ послС этого Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΎΠ΄Π½Π° ΠΈΠ· Π·Π°Π΄Π°Ρ‡, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… наш сСмафор.

Рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Windows, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π°ΠΌΠΈ.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сСмафор, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateSemaphore (), синтаксис ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTES lpThreadSecurity, LONG lSemInitialCount, LONG lSemMaxCount, LPCTSTR lpszSemName)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

lpThreadSecurity — ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ доступа ΠΊ ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Ρƒ. Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ся, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ NULL;

lSemInitialCount — Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π² ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ΠΈ ΠΌΠ΅Π½ΡŒΡˆΠ΅ Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° lSemMaxCount;

lSemMaxCount — максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π² ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π΅. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ большС нуля;

lpszSemNameΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ имя сСмафора. Имя Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ события, сСмафора ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° отобраТСния Ρ„Π°ΠΉΠ»Π°;

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ хэндл созданного сСмафора, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС — возвращаСтся NULL.

Для уничтоТСния сСмафора Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CloseHandle (). Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса всС созданныС ΠΈΠΌ ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ автоматичСски.

Если сСмафор ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для синхронизации Π·Π°Π΄Π°Ρ‡, созданных Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ прилоТСния, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ бСзымянный сСмафор, ΡƒΠΊΠ°Π·Π°Π² Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° lpszSemName Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateSemaphore () Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL.

Π’ Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… процСссов, слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ имя сСмафора. ΠŸΡ€ΠΈ этом ΠΎΠ΄ΠΈΠ½ процСсс создаСт сСмафор с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateSemaphore, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ, получая ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ для ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сСмафора.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ сСмафор ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ OpenSemaphore (), синтаксис ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ

HANDLE OpenSemaphore (DWORD dwAccessFlag, BOOL bInherit, LPCTSTR lpszSemName)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

dwAccessFlag — ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ доступа ΠΊ ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Ρƒ;

bInherit — опрСдСляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ наслСдования сСмафора Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами, создаваСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateProcess ();

lpszSemNameΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ имя ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ сСмафора.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ хэндл ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ сСмафора, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС — возвращаСтся NULL.

Π€Π»Π°Π³ΠΈ доступа ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

ОписаниС

SEMAPHORE_ALL_ACCESS

УстанавливаСт всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ„Π»Π°Π³ΠΈ доступа для Π΄Π°Π½Π½ΠΎΠ³ΠΎ сСмафора

SEMAPHORE_MODIFY_STATE

Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ счСтчика рСсурсов Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReleaseSemaphore ()

SYNCHONIZE

Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ использованиС Π² Π»ΡŽΠ±ΠΎΠΉ ΠΈΠ· ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сигнала ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния сСмафора

Для увСличСния значСния счСтчика сСмафора ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ReleaseSemaphore (), синтаксис ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ

BOOL ReleaseSemaphore (HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviosCount)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

hSemaphore — хэндл освобоТдСнного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сСмафора;

lReleaseCount — число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, установлСнноС Π² ΡΡ‡Π΅Ρ‚Ρ‡ΠΈΠΊΠ΅ рСсурсов сСмафора ΠΏΡ€ΠΈ Π΅Π³ΠΎ освобоТдСнии;

lpPreviosCount — ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΌΠ΅ΡΡ‚ΠΎ хранСния ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ значСния счСтчика.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС — возвращаСтся NULL.

Ѐункция ReleaseSemaphore () ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика сСмафора, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСдаСтся Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ hSemaphore, Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ lReleaseCount.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lReleaseCount Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, большСС нуля.

ΠŸΡ€ΠΈ этом Ссли Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ увСличСния Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡΠΈΡ‚ΡŒ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈ создании сСмафора, функция ReleaseSemaphore ()Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ошибки ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика.

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReleaseSemaphore (), записываСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° LONG. АдрСс этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lpPreviousCount.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Π²ΡƒΡ… Π·Π°Π΄Π°Ρ‡:

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ рСсурс, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ рСгулируСтся сСмафором. Они ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ это послС использования рСсурса ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ своим Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, эта функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована Π½Π° ΡΡ‚Π°ΠΏΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ прилоТСния.

Боздавая сСмафор с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ счСтчика, Ρ€Π°Π²Π½Ρ‹ΠΌ Π½ΡƒΠ»ΡŽ, главная Π·Π°Π΄Π°Ρ‡Π° Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π·Π°Π΄Π°Ρ‡, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ… ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ этого сСмафора. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ главная Π·Π°Π΄Π°Ρ‡Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReleaseSemaphore () ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика сСмафора Π΄ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ извСстноС количСство ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡ Π±ΡƒΠ΄Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ интСрфСйсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Windows Π½Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ значСния счСтчика сСмафора.

Π­Ρ‚ΠΎΡ‚ счСтчик ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ WaitForSingleObject () ΠΈΠ»ΠΈ WaitForMultipleObject (). Если Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ нСсколько Ρ€Π°Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ оТидания для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ сСмафора, содСрТимоС Π΅Π³ΠΎ счСтчика ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒΡΡ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΅ΠΌΠ°Ρ„ΠΎΡ€Π°ΠΌΠΈ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

— ΠΏΠΎΡ‚ΠΎΠΊ создаСт ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ сСмафор с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CreateSemaphore () ΠΈΠ»ΠΈ OpenSemaphore () соотвСтствСнно;

— ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForSingleObject () для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, свободСн Π»ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊΡƒ рСсурс. Π’ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ дальнСйшиС дСйствия;

— ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ReleaseSemaphore (), ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΡƒΡŽ сСмафор.

ЕдинствСнная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ опрСдСлСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния счСтчика сСмафора Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ этого значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ReleaseSemaphore () Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π΄ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡ, Π±ΡƒΠ΄Π΅Ρ‚ записано Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReleaseSemaphore () Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lplPreviousCount.

Одной ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, которая Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ использовании сСмафоров являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° синхронизации — Π²Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (Π΄Π΅Π΄Π»ΠΎΠΊΠΈ, ΠΊΠ»ΠΈΠ½Ρ‡ΠΈ, Ρ‚ΡƒΠΏΠΈΠΊΠΈ).

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ