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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 110

Автор Π”. БтСфСнс

ПослС создания ΠΏΠΎΡ‚ΠΎΠΊΠ° myThread ΠΏΠΎΡ‚ΠΎΠΊ main ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° Π½Π΅ достигнСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строки.

boost::thread::yield();

Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΡ‚ΠΎΠΊ main) Π² Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ состояниС, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ»ΠΈ процСсс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ, которая зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ yield опСрационная систСма увСдомляСтся ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡƒΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠ²Π°Π½Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ это врСмя Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ выполняСт threadFun. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ threadFun Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ исчСзаСт. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ thread Π½Π΅ уничтоТаСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π‘++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ находится Π² области видимости. Π­Ρ‚Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° β€” это Π½Π΅ΠΊΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π² динамичСской памяти ΠΈΠ»ΠΈ Π² стСкС ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π‘++. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости ΠΏΠΎΡ‚ΠΎΠΊΠ°, всС находящиСся Π² стСкС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ, ΠΈΠ»ΠΈ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ delete для thread*, исчСзаСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ thread, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² динамичСской памяти. Но ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ thread Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ просто ΠΊΠ°ΠΊ прокси ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚. Они просто ΠΎΡ‚ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΏΠ»ΠΎΡ…ΠΎ.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ рСсурсы, ΠΈ Π² любом (Ρ…ΠΎΡ€ΠΎΡˆΠΎ спроСктированном) ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ доступом ΠΊ Ρ‚Π°ΠΊΠΈΠΌ рСсурсам (ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, сокСтам, Ρ„Π°ΠΉΠ»Π°ΠΌ, «сырой» памяти ΠΈ Ρ‚.Π΄.) осущСствляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ со стороны Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (см. Ρ€Π΅Ρ†Π΅ΠΏΡ‚ 12.2). Если ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы оказываСтся Β«ΡƒΠ±ΠΈΡ‚Ρ‹ΠΌΒ», ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ свои Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ свои рСсурсы, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Β«ΡƒΠ±ΠΈΡ‚Ρ‹ΠΉΒ» процСсс Π½Π΅ оставляСт шансов Π½Π° очистку Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ освобоТдСниС рСсурсов ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ каТСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½, β€” это всС Ρ€Π°Π²Π½ΠΎ Ρ‡Ρ‚ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ лСстницу ΠΈΠ·-ΠΏΠΎΠ΄ маляра, ΠΊΠΎΠ³Π΄Π° врСмя Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΎΡΡŒ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ прСдусмотрСна функция-Ρ‡Π»Π΅Π½ join. Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 12.1, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ join, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, join β€” это Π²Π΅ΠΆΠ»ΠΈΠ²Ρ‹ΠΉ способ увСдомлСния ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΆΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

myThread.join();

ΠŸΠΎΡ‚ΠΎΠΊ, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ join, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС оТидания, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, прСдставлСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ myThread. Если ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΈ join. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ join β€” Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ способ оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ, Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ осмыслСнноС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ threadFun, Π½ΠΎ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ join, ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² этом, выполняя Π² threadFun Ρ†ΠΈΠΊΠ» ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ опСрационная систСма ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ процСсс вмСстС со всСми Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ процСссами нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ ΠΎΠ½ΠΈ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π‘Π΅Π· Π²Ρ‹Π·ΠΎΠ²Π° join функция main Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ окончания Ρ€Π°Π±ΠΎΡ‚Ρ‹ своих Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: ΠΎΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы уничтоТаСтся.

Если трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², рассмотритС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡ… группирования Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ thread_group. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ thread_group ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ двумя способами. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ add_thread с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ thread, ΠΈ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ. НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

boost::thread_group grp;

boost::thread* p = new boost::thread(threadFun);

grp.add_thread(p);

// Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ дСйствия...

grp.remove_thread(p);

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ дСструктора grp ΠΎΠ½ ΡƒΠ΄Π°Π»ΠΈΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ delete ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² add_thread. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² thread_group Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹Ρ… Π² динамичСской памяти. УдаляйтС ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° remove_thread с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ адрСса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° (remove_thread Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ°, сравнивая значСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π° Π½Π΅ сами ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹). remove_thread ΡƒΠ΄Π°Π»ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠΉΡΡ Π½Π° этот ΠΏΠΎΡ‚ΠΎΠΊ Π³Ρ€ΡƒΠΏΠΏΡ‹, Π½ΠΎ Π²Π°ΠΌ придСтся всС ΠΆΠ΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ сам ΠΏΠΎΡ‚ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° delete.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ, Π½Π΅ создавая Π΅Π³ΠΎ нСпосрСдствСнно, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для этого Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ create_thread, которая (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. НапримСр, для пороТдСния Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ добавлСния ΠΈΡ… Π² Π³Ρ€ΡƒΠΏΠΏΡƒ сдСлайтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

boost::thread_group grp;

grp.create_thread(threadFun);

grp.create_thread(threadFun); // Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π³Ρ€ΡƒΠΏΠΏΠ° grp содСрТит Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°

grp.join_all(); // ΠŸΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ create_thread ΠΈΠ»ΠΈ add_thread Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ join_all для оТидания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π³Ρ€ΡƒΠΏΠΏΡ‹. Π’Ρ‹Π·ΠΎΠ² join_all равносилСн Π²Ρ‹Π·ΠΎΠ²Ρƒ join для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π³Ρ€ΡƒΠΏΠΏΡ‹: join_all Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π³Ρ€ΡƒΠΏΠΏΡ‹.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° позволяСт Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Однако с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСдств Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost Threads это дСлаСтся ΠΎΠ±ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎ Π»Π΅Π³ΠΊΠΎ, поэтому Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Ρ‹ настоящСй Π³Π»Π°Π²Ρ‹, Π³Π΄Π΅ Π΄Π°ΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСдостСрСТСния ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ примСнСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 12.2.

12.2. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ потокозащищСнности рСсурсов

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ трСбуСтся Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ рСсурса нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π’ Ρ†Π΅Π»ΠΎΠΌ это называСтся обСспСчСниСм потокозащищСнности (thread-safe) рСсурсов ΠΈΠ»ΠΈ сСриализациСй доступа ΠΊ Π½ΠΈΠΌ.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ класс mutex, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² boost/thread/mutex.hpp, для синхронизации доступа ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12.2 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² простых случаях ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ mutex для управлСния ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ доступом ΠΊ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 12.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ класса

#include <iostream>

#include <boost/thread/thread.hpp>

#include <string>


// ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ класс ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ; Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ вмСсто Π½Π΅Π³ΠΎ слСдуСт

// ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ std::queue

template<typename T>

class Queue {

public:

 Queue() {}

 ~Queue() {}

 void enqueue(const T& x) {

  // Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ для этой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

  boost::mutex::scoped_lock lock(mutex_);

  list_.push_back(x);

  // scoped_lock автоматичСски уничтоТаСтся (ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ

  // разблокируСтся) ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· области видимости

 }


 T dequeue() {

  boost::mutex::scoped_lock lock(mutex_);

  if (list_.empty())

    throw "empty!";      // Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области

  T tmp = list_.front(); // видимости, поэтому Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° освобоТдаСтся

  list_.pop_front();

  return(tmp);

 } // Π‘Π½ΠΎΠ²Π° ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· области видимости ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ разблокируСтся


private:

 std::list<T> list_;

 boost::mutex mutex_;

};


Queue<std::string> queueOfStrings;


void sendSomething() {

 std::string s;

 for (int i = 0; i < 10; ++i) {

  queueOfStrings.enqueue("Cyrus");

 }

}


void recvSomething() {

 std::string s;

 for(int i = 0; i < 10; ++i) {

  try {

   s = queueOfStrings.dequeue();

  } catch(...) {}

 }

}


int main() {

 boost::thread thr1(sendSomething);

 boost::thread thr2(recvSomething);

 thr1.join();

 thr2.join();

}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ потокозащищСнности классов, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π±Π»ΠΎΠΊΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² являСтся ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ программирования. Если Π²Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния с возмоТностями ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ своим Π½Π°Π±ΠΎΡ€ΠΎΠΌ рСсурсов, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π² стСкС ΠΈ динамичСской памяти, рСсурсами ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ Ρ‚.Π΄. Однако Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π²Π°ΠΌ придСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ совмСстноС использованиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ рСсурсов. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ совмСстная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… запросов (ΠΊΠ°ΠΊ это происходит Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ Π²Π΅Π±-сСрвСрС) ΠΈΠ»ΠΈ Π½Π΅Ρ‡Ρ‚ΠΎ достаточно простоС, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π² cout). Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ способ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ бСзопасного совмСстного использования рСсурсов ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° (mutex), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ Ρ‡Π΅ΠΌΡƒ-Π»ΠΈΠ±ΠΎ.