Threads posix win32 Ρ‡Ρ‚ΠΎ это

Threads posix win32 Ρ‡Ρ‚ΠΎ это

Π•ΡΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹ MinGW для 32-Π±ΠΈΡ‚Π½ΠΎΠΉ ΠΈ для 64-Π±ΠΈΡ‚Π½ΠΎΠΉ вСрсий Windows. Установка 64-Π±ΠΈΡ‚Π½ΠΎΠΉ вСрсии ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ понятных ΠΎΠΏΡ†ΠΈΠΉ настройки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ рассмотрСны Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

[ΠŸΡ€ΠΎΡ†Π΅ΡΡ установки MinGW-W64 ΠΏΠΎ шагам]

2. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ экранС появится привСтствиС мастСра установки, просто ΠšΠ»ΠΈΠΊΠ½ΠΈΡ‚Π΅ Next.

Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Threads posix win32 Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это

3. Π—Π°Ρ‚Π΅ΠΌ появляСтся Π²Π°ΠΆΠ½Ρ‹ΠΉ экран настройки, Π³Π΄Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ систСмы.

Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Threads posix win32 Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это

Architecture: i686 ΠΈΠ»ΠΈ x86_64. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ x86_64, Ссли Ρƒ Вас соврСмСнный процСссор Athlon ΠΈΠ»ΠΈ Intel. Если Ρƒ Вас старый Pentium Pro, Pentium II ΠΈΠ»ΠΈ Pentium III, Ρ‚ΠΎ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ i686.

Exception: dwarf, sjlj ΠΈΠ»ΠΈ seh. Π­Ρ‚ΠΎ относится ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок. Бостав Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка зависит ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ.

Dwarf-2 EH. РСализация для Windows сама ΠΏΠΎ сСбС Π½Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² условиях исполнСния 64-Π±ΠΈΡ‚Π½Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Windows. Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ win32 Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠ΄, Π½Π΅ совмСстимый со стандартом dw2; это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ любоС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ происходит Ρ‡Π΅Ρ€Π΅Π· Π»ΡŽΠ±Ρ‹Π΅ «Ρ‡ΡƒΠΆΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΡ‹» non-dw2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΎΡ‚ΠΊΠ°Π·Ρƒ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ систСмныС DLL Windows ΠΈ DLL, встроСнныС Π² Visual Studio. РаскручиваниС ΠΊΠΎΠ΄Π° Dwarf-2 Π² gcc Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ инспСктированиС сборки x86, ΠΈ ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π±Π΅Π· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ dwarf-2.

GCC ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (EH):

DWARF-2 (DW2) EH, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия Π² выполняСмом ΠΊΠΎΠ΄Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ DWARF-2 (ΠΈΠ»ΠΈ DWARF-3). DW-2 EH ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° исполняСмого ΠΊΠΎΠ΄Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄ добавляСтся большиС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΡ‚ΠΊΠ°Ρ‚Π° ΠΏΠΎ содСрТимому стСка.

SJLJ. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ базируСтся Π½Π° setjmp/longjmp (SJLJ). Он нСсколько ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ DW2 EH (влияСт Π΄Π°ΠΆΠ΅ Π½Π° Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ), ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±Ρ‹Π» скомпилирован GCC, ΠΈΠ»ΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ истории Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· стСк (call-stack unwinding information).

Structured Exception Handling (SEH). Windows ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свой собствСнный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, извСстный ΠΊΠ°ΠΊ Structured Exception Handling (SEH). К соТалСнию, GCC ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚. Однако обСщаСтся, Ρ‡Ρ‚ΠΎ для x64 Π² появится ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° SEH начиная с вСрсии GCC 4.8.

Exception handling models of GCC site:stackoverflow.com
C++ Exception Handling for IA-64 site:static.usenix.org
EH newbies howto gcc.gnu.org
MinGW 64 bit Exception handling: SJLJ, DWARF, and SEH site:qt-project.org

Π― Π²Ρ‹Π±Ρ€Π°Π» для своСй установки Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ seh.

4. На этом шагС Π½ΡƒΠΆΠ½ΠΎ просто Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ установки. ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ всС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Threads posix win32 Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это

5. Запустится процСсс Π·Π°ΠΊΠ°Ρ‡ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΉΠΌΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя.

Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Threads posix win32 Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это

По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Next ΠΈ послС окончания копирования Finish.

Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Threads posix win32 Ρ‡Ρ‚ΠΎ это. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это. Π€ΠΎΡ‚ΠΎ Threads posix win32 Ρ‡Ρ‚ΠΎ это

Если Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° c:\Program Files\mingw-w64\x86_64-4.9.2-win32-seh-rt_v3-rev1\mingw64\bin\ Π·Π°ΠΏΡƒΡΠΊΠ°Π»ΠΈΡΡŒ Π±Π΅Π· Π²Π²ΠΎΠ΄Π° ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ, Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² ΠΏΡƒΡ‚ΠΈ поиска (Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния %Path%).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠΠ°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠΌ. Н. Π­. Π‘Π°ΡƒΠΌΠ°Π½Π°
Bauman National Library

ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты

POSIX Threads

POSIX Threads

Communications protocol
PurposeпозволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мноТСство Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π²ΠΎ врСмя
Developer(s)POSIX.1c, Threads extensions (IEEE Std 1003.1c-1995)
Introduced1995 ; 26 years ago ( 1995 )
Based onC
InfluencedPOSIX 1003.1-2001

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Π’ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса Π΅ΡΡ‚ΡŒ адрСсноС пространство ΠΈ СдинствСнный ΠΏΠΎΡ‚ΠΎΠΊ управлСния. ЀактичСски это ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ процСсса. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ситуации, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ адрСсном пространствС нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² управлСния, выполняСмых ΠΊΠ²Π°Π·ΠΈΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡ΡƒΡ‚ΡŒ Π»ΠΈ Π½Π΅ обособлСнными процСссами (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ‰Π΅Π³ΠΎ адрСсного пространства).

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

Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² являСтся Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ быстрота) ΠΈΡ… создания ΠΈ Π»ΠΈΠΊΠ²ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π±ΠΎΠ»Π΅Π΅ «тяТСловСсными» процСссами. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… систСмах созданиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² осущСствляСтся Π² 10–100 Ρ€Π°Π· быстрСС, Ρ‡Π΅ΠΌ созданиС процСссов. Π­Ρ‚ΠΎ свойство особСнно пригодится, ΠΊΠΎΠ³Π΄Π° потрСбуСтся быстро ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². [Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ 1]

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ касаСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Когда ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, ΠΎΠ½ΠΈ Π½Π΅ приносят Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ вычислСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ тратится Π½Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² позволяСт этим дСйствиям ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ускоряя Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΏΠΎΡ‚ΠΎΠΊΠΈ вСсьма ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для систСм, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… нСсколько Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… процСссоров, Π³Π΄Π΅ Π΅ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… вычислСний.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ стандартС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ 60 Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Они ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π° 4 ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ:

ОпишСм ряд самых основных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.

Π’Ρ‹Π·ΠΎΠ²Ρ‹, связанныС с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
pthread_createΠ‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°
pthread_exitΠ—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°
pthread_joinОТиданиС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°
pthread_yieldОсвобоТдСниС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅

Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ

pthread_attr_initΠ‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ инициализация структуры Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ°
pthread_attr_destroyΠ£Π΄Π°Π»Π΅Π½ΠΈΠ΅ структуры Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π”Π²Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, связанных с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, относятся ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ. Ѐункция pthread_attr_init создаСт структуру Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΅ значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΈ значСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚) ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π·Π° счСт Ρ€Π°Π±ΠΎΡ‚Ρ‹ с полями Π² структурС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, функция pthread_attr_destroy удаляСт структуру Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΡƒΡŽ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, освобоТдая ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½Π° Π·Π°Π½ΠΈΠΌΠ°Π»Π°. На ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ использовал Π΄Π°Π½Π½ΡƒΡŽ структуру, это Π½Π΅ влияСт, ΠΈ ΠΎΠ½ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ своС сущСствованиС.

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Pthread, рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅. Основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ†ΠΈΠΊΠ»Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, cколько ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² константС NUMBER_OF_THREADS (количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²), создавая ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сообщив ΠΎ своих намСрСниях. Если ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ удастся, ΠΎΠ½Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎΠ± ошибкС ΠΈ выполняСт Π²Ρ‹Ρ…ΠΎΠ΄. ПослС создания всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² осущСствляСтся Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΈ создании ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ однострочноС сообщСниС, объявляя ΠΎ своСм сущСствовании, послС Ρ‡Π΅Π³ΠΎ осущСствляСт Π²Ρ‹Ρ…ΠΎΠ΄. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выводятся Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сообщСния, Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΈ ΠΏΡ€ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… запусках ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌ.

ΠœΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Pthreads

pthread_mutex_initΠ‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°
pthread_mutex_destroyΠ£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°
pthread_mutex_lockОвладСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°
pthread_mutex_trylockОвладСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ с ошибкой
pthread_mutex_unlockΠ Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

УсловныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

НаиболСС Π²Π°ΠΆΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹, связанныС с условными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Π’ Π½Π΅ΠΉ прСдставлСны Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для создания ΠΈ уничтоТСния условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Π’Ρ‹Π·ΠΎΠ² ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅
pthread_cond_initΠ‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
pthread_cond_destroyΠ£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ
pthread_cond_waitΠ‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ сигнала
pthread_cond_signalΠ‘ΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈ Π΅Π³ΠΎ активизация
pthread_cond_broadcastΠ‘ΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΈ активизация всСх этих ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

УсловныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ вмСстС. Π‘Ρ…Π΅ΠΌΠ° для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° состоит Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π° Π·Π°Ρ‚Π΅ΠΌ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π½Π° основС значСния условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ссли ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ трСбуСтся. Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ подаст Π΅ΠΌΡƒ сигнал, ΠΈ ΠΎΠ½ смоТСт ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’Ρ‹Π·ΠΎΠ² pthread_cond_wait осущСствляСтся Π½Π΅Π΄Π΅Π»ΠΈΠΌΠΎ ΠΈ выполняСт Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΊΠ°ΠΊ ΠΎΠ΄Π½Ρƒ Π½Π΅Π΄Π΅Π»ΠΈΠΌΡƒΡŽ ΠΈ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

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

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния-записи

Π˜Ρ‚Π°ΠΊ, Π² случаС Ссли Π½ΠΈΡ‚ΡŒ пытаСтся Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ Ρ‚Π° Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° сСйчас Π½Π° запись (Π»ΠΈΠ±ΠΎ ΠΎΠ½Π° свободна, Π»ΠΈΠ±ΠΎ ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅) Ρ‚ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ Π΅ΠΉ удаСтся ΠΈ ΠΎΠ½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Ссли ΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° Π½Π° запись Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π΅Π΅ освобоТдСния. Если ΠΆΠ΅ Π½ΠΈΡ‚ΡŒ Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° запись, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² эксклюзивном Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ освобоТдСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ссли Ρ‚Π° Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π° запись, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ свободна. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос ΠΊΡ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ссли Ρ‚Π° освобоТдаСтся ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ ΠΆΠ΄ΡƒΡ‰ΠΈΠ΅ писатСли ΠΈ ΠΆΠ΄ΡƒΡ‰ΠΈΠ΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π² случаС Ссли Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° писатСля, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΈ писатСлСй, Ссли ΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ. Оба Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ситуациях, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»Π΅Π½, Π² случаС Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ наши Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС обновились ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ пользовались Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ΄ΠΎΠ±Π΅Π½ ΠΊΠΎΠ³Π΄Π° наша Ρ†Π΅Π»ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠ΅ обслуТиваниС Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ Π²Π°ΠΆΠ½Π°.

ΠŸΡ€ΠΈ этом согласно стандарту Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ установлСна, Ссли Π½Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎ записи ΠΈ Π½Π΅Ρ‚ Π½ΠΈΡ‚Π΅ΠΉ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… возмоТности установки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записи. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях Π½ΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΏΠ°Ρ‚ΡŒ Π΄ΠΎ появлСния возмоТности ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ стандартом это Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ с ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ писатСлСй, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ всСгда Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΡƒΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΈΠΌ Π΄ΠΎΡ€ΠΎΠ³Ρƒ. Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π­Ρ‚Π° функция ΠΊΠ°ΠΊ ΠΈ слСдуСт ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ устанавливаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи Π² случаС, Ссли для Π΄Π°Π½Π½ΠΎΠ³ΠΎ (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния/записи) Π½Π΅ установлСно Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях Π²Ρ‹Π·Π²Π°Π²ΡˆΠ°Ρ Π΅Π΅ Π½ΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ освобоТдСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. ΠΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ½ΡΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΡƒΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ Сю Ρ€Π°Π½Π΅Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

ΠŸΡ€ΠΈ этом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Π΄Π°Π½Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи данная Π½ΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π°Π²ΠΎΠΌ чтСния, Π»ΠΈΠ±ΠΎ ΠΏΡ€Π°Π²ΠΎΠΌ записи, Ρ‚ΠΎ ΠΏΡ€ΠΈ снятии Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ всСгда извСстно, ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΈΠΏΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΌΡ‹ сСйчас снимаСм, ΠΈ соотвСтствСнно эта функция Π½Π΅ нуТдаСтся Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ…. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠ°ΠΊ ΠΈ Π² случаС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° рСсурсы Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ свободной Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ чтСния/записи ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ освобоТдСны ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π‘Π°Ρ€ΡŒΠ΅Ρ€Ρ‹

Π“Π΄Π΅ послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ count Π·Π°Π΄Π°Π΅Ρ‚ число Π½ΠΈΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠΉΡ‚ΠΈ Π΄ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° (Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_barrier_wait ) ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ смогут ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π Π°Π· сущСствуСт функция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π±Π°Ρ€ΡŒΠ΅Ρ€, Ρ‚ΠΎ сущСствуСт ΠΈ комплимСнтарная функция которая ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ:

Как ΠΈ Π² случаС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² синхронизации данная функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС Ссли Π½Π° ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅ΠΌΠΎΠΌ Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ. Ну ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† сущСствуСт функция Π²Ρ‹Π·ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ собствСнно ΠΈ соотвСтствуСт ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π½ΠΈΡŽ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°:

Π‘ΠΏΠΈΠ½Π»ΠΎΠΊ

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² синхронизации, ΠΏΡ€ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ это spin lock(спинлок). Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ этот ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ отличаСтся ΠΎΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Основная стоящая Π·Π° Π½ΠΈΠΌΠΈ идСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈΡ‚ΡŒ Π² случаС Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π°, ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒΡΡ, провСряя Π½Π΅ освободилась Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ слово spin Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ). ЀактичСски спинлок это ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ основанный Π½Π° использовании Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ оТидания. Какой Ρ‚ΠΎΠ³Π΄Π° смысл Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π΅? Π’ случаС Ссли ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π° однопроцСссорной машинС спинлок Π±ΡƒΠ΄Π΅Ρ‚ бСсполСзно ΡΡŠΠ΅Π΄Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»Ρ‹ процСссора Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π²Π»Π°Π΄Π΅ΡŽΡ‰ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π½ΠΈΡ‚ΡŒ) ΠΈ ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΌΠ°Π»Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ критичСской сСкции Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΠΎΠΉ этим ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠΌ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ Π½Π΅ ΠΆΠ΄Π°Ρ‚ΡŒ Π΄ΠΎΠ»Π³ΠΎ ΠΈ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π½ΠΈΡ‚ΡŒ) спинлок ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован эффСктивнСС Ρ‡Π΅ΠΌ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. Π­Ρ‚ΠΎ обусловлСно Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠ»Π³ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½ΠΈΡ‚ΠΈ Π² сон, Π²ΠΎΠΎΠ±Ρ‰Π΅ считаСтся Ρ‡Ρ‚ΠΎ spin lock рСализуСтся Π½Π° основС самых быстрых ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² синхронизации доступных Π² систСмС. Π’ случаС Ссли ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… условий Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ, спинлок Π½Π΅ даст Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π²Ρ‹Π³ΠΎΠ΄Π½Π΅Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ. Богласно стандарту Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² прСдставляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ‚ΠΈΠΏΠ° pthread_spinlock_t ΠΈ Π½Π°Π±ΠΎΡ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Π½ΠΈΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ практичСски ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ опСрациями для ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°:

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Ρ‚Π΅ΠΌΡ‹ mingw-w64: posix vs win32

Π― ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽ mingw-w64 Π½Π° Windows, ΠΈ Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: win32 threads ΠΈ posix threads. Π― знаю, Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ win32 ΠΈ pthreads, Π½ΠΎ я Π½Π΅ понимаю, Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌΠΈ. Π― сомнСваюсь, Ρ‡Ρ‚ΠΎ Ссли я Π²Ρ‹Π±Π΅Ρ€Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ posix, это ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΌΠ½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WinAPI, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ CreateThread.

каТСтся, Ρ‡Ρ‚ΠΎ эта опция ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ API ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, Π½ΠΎ Ρ‡Π΅ΠΌ? По НКУ, libstdc++ ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅?

Π― нашСл это: Π² Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ thread_posixs ΠΈ thread_win32 Π² ΠΏΠΎΡ€Ρ‚Ρƒ gcc windows?

ΠΊΠΎΡ€ΠΎΡ‡Π΅ говоря, для этой вСрсии mingw выпуск threads-posix Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API posix ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ использованиС std::thread, Π° threads-win32 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API win32 ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Ρ‡Π°ΡΡ‚ΡŒ std::thread стандарта.

Ok, Ссли я Π²Ρ‹Π±Π΅Ρ€Ρƒ win32 threads, Ρ‚ΠΎ std:: thread Π±ΡƒΠ΄Π΅Ρ‚ нСдоступно, Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ win32 ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Но ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ΅ΠΌ?

3 ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

Π― Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта опция Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π²Π°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ любой ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ (ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅Ρ‚ влияниС Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ API Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² своСм ΠΊΠΎΠ΄Π΅). Он ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния GCC (libgcc / libstdc++/. ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ΠžΠ³ΠΎΠ²ΠΎΡ€ΠΊΠ°, цитируСмая @James, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ модСлью ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ GCC, Π° скорСС с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ CRT Microsoft.

Π½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ влияниС Π½Π° любой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Win32 APIs ΠΈΠ»ΠΈ Pthreads APIs. Π’Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π°.

части срСды выполнСния GCC (Π² частности, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ) зависят ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ срСды выполнСния, которая Π±Ρ‹Π»Π° построСна с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ POSIX, Π½ΠΎ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² своСм собствСнном ΠΊΠΎΠ΄Π΅ с API Win32, Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρƒ вас ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Win32 срСды выполнСния, Π²Ρ‹, вСроятно, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ API Win32 Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Π¦ΠΈΡ‚Π°Ρ‚Π° ΠΈΠ· компилятор MinGW FAQ:

ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· C++11 std::thread Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Win32 threading. Π­Ρ‚ΠΈ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ для мСня: https://github.com/meganz/mingw-std-threads

ΠΈΠ· истории Ρ€Π΅Π²ΠΈΠ·ΠΈΠΉ ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ какая-Ρ‚ΠΎ нСдавняя ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‡Π°ΡΡ‚ΡŒΡŽ срСды выполнСния mingw64.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π° Π‘++ для Windows ΠΈ UNIX

ΠŸΠΎΡ‚ΠΎΠΊΠΈ (threads) ΡΠ²Π»ΡΡŽΡ‚ΡΡ вСсьма ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ для ускорСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ придания ΠΈΠΌ гибкости Π² использовании процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, особСнно Π² наш ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ бСсповоротно Π½Π°ΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΠΉ Π²Π΅ΠΊ многоядСрных процСссоров, стоящих ΠΏΠΎΡ‡Ρ‚ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ соврСмСнном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Π§Π΅Π³ΠΎ ΡƒΠΆ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ сСрвСрных ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ….

Π˜Ρ‚Π°ΠΊ, задался я Ρ†Π΅Π»ΡŒΡŽ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΈ простой класс Π½Π° Π‘++ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’ силу особСнностСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ½Π΅ приходится ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ систСмами, ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΈΠΌΠ΅Ρ‚ΡŒ максимально пСрСносимый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. На сСгодняшний дСнь стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ для ΠΌΠΈΡ€Π° UNIX ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ POSIX Для Windows Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ рСализация этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½ΠΎ Π² цСлях ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ внСшнСй зависимости для этой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ я Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Windows API, Π±Π»Π°Π³ΠΎ назначСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ. ΠŸΡ€ΠΈ использования POSIX Threads ΠΏΠΎΠ΄ Windows Π΄Π°Π½Π½Ρ‹ΠΉ класс Π΅Ρ‰Π΅ упрощаСтся (Π½Π°Π΄ΠΎ просто Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ всю Windows ΡΠ΅ΠΊΡ†ΠΈΡŽ), Π½ΠΎ для мСня Π»ΠΈΡ‡Π½ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π±Ρ‹Π»ΠΎ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ зависимости ΠΎΡ‚ виндусовых POSIX Threads. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ.

Для компиляции Π² Windows Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ макрос WIN32. Π’ этом случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Windows API. Π˜Π½Π°Ρ‡Π΅ подразумСваСтся Ρ€Π°Π±ΠΎΡ‚Π° с pthreads. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Cygwin, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ Ρ‡Π΅Ρ€Π΅Π· Windows API ΠΈ Ρ‡Π΅Ρ€Π΅Π· pthreads.

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ€Π΅Π·ΠΎΠ½Π½Ρ‹ΠΉ вопрос β€” я ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ провСряСт ΠΊΠΎΠ΄ ошибки. Π’Π΄Ρ€ΡƒΠ³ Ρ‡Ρ‚ΠΎ? Π― ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ я встрСтил Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ случай Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ошибки ΠΎΡ‚ pthread_create.

Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π½Π° AIX’e ΠΏΡ€ΠΈ использовании связывания (linking) Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π±Ρ‹Π»Π° слинкована с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ pthreads (я Π·Π°Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈΠΊ β€œ-lpthread”), Π½ΠΎ ΠΈΠ·-Π·Π° особСнностСй Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния (Ρ‚Π°ΠΊ любимой AIX’ом) Π»ΠΈΠ½ΠΊΠ΅Ρ€ сообщил, Ρ‡Ρ‚ΠΎ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ Π²Ρ‹Π΄Π°Π» ΠΌΠ½Π΅ исполняСмый Ρ„Π°ΠΉΠ». Π’ процСссС ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΠΈ ΠΎΠ΄Π½Π° функция ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ pthreads просто Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ ошибки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_create() ΠΎΠ·Π½Π°Ρ‡Π°Π» Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ° β€œΠ½Π΅ ΠΌΠΎΠ³Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ файл”, ΠΈ Ρ‡Π΅Π³ΠΎ я сдСлал Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ нСдоступСн. Π’ΠΎΠΎΠ±Ρ‰Π΅, Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния β€” это довольно хитрая ΡˆΡ‚ΡƒΠΊΠ°. Π’ Π΄Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ связывания внСшниС связи ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΡƒΠΆΠ΅ Π½Π° стадии Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ это Π½Π΅ Ρ‚ΠΎΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° раздСляСмой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΈ Ρ‚.Π΄.), Π½ΠΎ Π²ΠΎΡ‚ фактичСский поиск Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ происходит Π² сам ΠΌΠΎΠΌΠ΅Π½Ρ‚ старта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π΄ΠΎ нСпосрСдствСнно запуска нСльзя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π² порядкС Π»ΠΈ внСшниС зависимости (ΠΊΠΎΠΌΠ°Π½Π΄Π° ldd Ρ€Π°ΠΏΠΎΡ€Ρ‚ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ довольно Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π½ΠΎ Π²ΠΎΡ‚ Π΅Π³ΠΎ практичСская ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠΊΠ° остаСтся для мСня Π·Π°Π³Π°Π΄ΠΊΠΎΠΉ. Π’ΠΎΠΎΠ±Ρ‰Π΅ AIX являСтся довольно ΠΈΠ·ΠΎΡ‰Ρ€Π΅Π½Π½ΠΎΠΉ систСмой Π² ΠΏΠ»Π°Π½Π΅ разнообразия ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² связывания. ПозТС я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠΈΡ… β€œΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉβ€ AIXΠ° Π½Π° эту Ρ‚Π΅ΠΌΡƒ.

Но вСрнСмся ΠΊ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ отсутствия ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthreads ΠΈ Windows API. Как я ΡƒΠΆΠ΅ упомянул, Ссли какая-Ρ‚ΠΎ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π·Π°Π²Π΅ΡˆΠ°Π΅Ρ‚ΡΡ с ошибкой, Ρ‚ΠΎ с ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠΉ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ Π² систСмС, ΠΈ это Π½Π΅ просто Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ошибкой, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ дальшС. Π­Ρ‚ΠΎ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½Π°Ρ ошибка, ΠΈ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π΅Ρ‰Π΅ ΠΏΠΎ Ρ‚ΡƒΡ‡Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½. ΠšΡ€ΠΎΠΌΠ΅ этого я Ρ…ΠΎΡ‚Π΅Π» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это класс максимально простым, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ‚Π°ΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π½Π΅ Π΄ΠΎΠΏΠΈΠ»ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ напильником ΠΏΠΎΠ΄ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ систСму ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΠ΄Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, ΠΆΡƒΡ€Π½Π°Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ‚.Π΄.), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ разная.

Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ΄ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ для собствСнных Π½ΡƒΠΆΠ΄.

ΠšΡ€ΠΎΠΌΠ΅ этого, я всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ unit-тСстированиС, ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ класс Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ тСсты. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ запускаСмый ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ»Π½ΠΎΠΉ сборкС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π°Π±ΠΎΡ€ тСстов сразу выявляСт Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ).

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ я расскаТу ΠΏΡ€ΠΎ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ использования описанного класса β€” ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠ°ΠΊ ΠΈΡ… Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ, ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ. Π― Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ unit-тСстированиС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ всС ΠΌΠΈΠ½ΠΈ-ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π² Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ тСсты вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ класс ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ ΠΌΠ½ΠΎΠΉ Π»ΠΈΡ‡Π½ΠΎ Π½Π° Windows (32- ΠΈ 64-Π±ΠΈΡ‚), Linux 2.6 (32- ΠΈ 64-Π±ΠΈΡ‚ Intel ΠΈ SPARC), AIX 5.3 ΠΈ 6, SunOS 5.2 64-bit SPARC, HP-UX ΠΈ HP-UX IA64.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ in-depth. ΠžΠ±Π·ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

ЗдравствуйтС Π΄ΠΎΡ€ΠΎΠ³ΠΈΠ΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² соврСмСнных ОБ (preemptive, cooperative threads). Π’Π°ΠΊΠΆΠ΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈ срСдства синхронизации Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Win32 API ΠΈ Posix Threads. Π₯отя Π½Π° Π₯Π°Π±Ρ€Π΅ большС популярны скриптовыС языки, ΠΎΠ΄Π½Π°ΠΊΠΎ основы β€” Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ всС πŸ˜‰

ΠŸΠΎΡ‚ΠΎΠΊΠΈ, процСссы, контСксты.

БистСмный Π²Ρ‹Π·ΠΎΠ² (syscall). Π”Π°Π½Π½ΠΎΠ΅ понятиС, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒ достаточно часто Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ нСсмотря Π½Π° всю ΠΌΠΎΡ‰ΡŒ звучания, Π΅Π³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ достаточно простоС πŸ™‚ БистСмный Π²Ρ‹Π·ΠΎΠ² β€” это процСсс Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ядра, ΠΈΠ· ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π Π΅ΠΆΠΈΠΌ ядра β€” ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Π² Π½ΡƒΠ»Π΅Π²ΠΎΠΌ ΠΊΠΎΠ»ΡŒΡ†Π΅ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ процСссора (ring0) с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ привилСгиями. Π Π΅ΠΆΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ β€” ΠΊΠΎΠ΄, исполняСмый Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΊΠΎΠ»ΡŒΡ†Π΅ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ процСссора (ring3), ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ привилСгиями. Если ΠΊΠΎΠ΄ Π² ring3 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π½Ρ‹Ρ… инструкций (ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ rdmsr/wrmsr, in/out, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ чтСния рСгистра cr3, cr4 ΠΈ Ρ‚.Π΄.), сработаСт Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс, Ρ‡Π΅ΠΉ ΠΊΠΎΠ΄ исполнял процСссор Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаях Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½. БистСмный Π²Ρ‹Π·ΠΎΠ² осущСствляСт ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° ядра Π² Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° инструкции syscall/sysenter, int2eh Π² Win2k, int80h Π² Linux ΠΈ Ρ‚.Π΄.

И Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ? ΠŸΠΎΡ‚ΠΎΠΊ (thread) β€” это, ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, процСсс выполнСния Π½Π° процСссорС Π½Π°Π±ΠΎΡ€Π° инструкций, Ρ‚ΠΎΡ‡Π½Π΅Π΅ говоря ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠžΠ±Ρ‰Π΅Π΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° процСссорС Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Как ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹ΠΌ ОБ. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ОБ, Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΡƒΡΡΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°, распрСдСляСт ΠΊΠ²Π°Π½Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ ставит ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

На ряду с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, сущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ такая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ процСсс. ΠŸΡ€ΠΎΡ†Π΅ΡΡ (process) β€” Π½Π΅ Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ нСкая абстракция, которая инкапсулируСт Π² сСбС всС рСсурсы процСсса (ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹Π΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. ) ΠΈ ΠΈΡ… дСскрипторы, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈ Ρ‚.Π΄. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΈΠΌΠ΅Π΅Ρ‚ своС собствСнноС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ адрСсноС пространство ΠΈ контСкст выполнСния, Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ адрСсноС пространство процСсса.

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π² Ρ€Π΅ΠΆΠΈΠΌ ядра

МодСль N:M ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… процСссов N Π½Π° M ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ€Π΅ΠΆΠΈΠΌΠ° ядра. ΠŸΡ€ΠΎΡ‰Π΅ говоря ΠΈΠΌΠ΅Π΅ΠΌ Π½Π΅ΠΊΡƒΡŽ Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½ΡƒΡŽ систСму, ΠΊΠΎΠ³Π΄Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ставится Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ΅ ОБ, Π° большая ΠΈΡ… Ρ‡Π°ΡΡ‚ΡŒ Π² ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² процСсса ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Как ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ привСсти GNU Portable Threads. Данная модСль достаточно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΠ°, Π½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ большСй ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ количСства систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

МодСль N:1. Как Π²Ρ‹ Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅ догадались β€” мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ядра ОБ. НапримСр Π²ΠΎΠ»ΠΎΠΊΠ½Π°.

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ

Однако, коопСративная ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Π°Π»Π° свою Π½Π΅ΡΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Росли ΠΎΠ±ΡŠΠ΅ΠΌΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π½Π° винчСстСрах, росла Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² сСтях. Π‘Ρ‚Π°Π»ΠΎ понятно, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ больший ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ обслуТивания ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ устройств, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ синхронных IO ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ Ρ‚.Π΄. Π’ это врСмя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ процСсс Π² систСмС обзавСлся Ρ‚Π°ΠΊΠΈΠΌ свойством, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов Π² Win32 API Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Π² ΠΊΠ½ΠΈΠ³Π΅ Π”ΠΆΠ΅Ρ„Ρ€ΠΈ Π ΠΈΡ…Ρ‚Π΅Ρ€Π°, ΠΌΡ‹ Π½Π° этом останавливатся Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ πŸ˜‰ Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊ с большим ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ‚Π΅ΡΠ½ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ с мСньшим. Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ†ΠΈΠΏ Π»Π΅Π³ Π² основу Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ многозадачности (preemptive multitasking). БСйчас всС соврСмСнныС ОБ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΠ»ΠΎΠΊΠΎΠ½ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎ ΡƒΡ€ΠΎΠ²Π½ΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Win32 API Threads

Если Π²Ρ‹ всС Π΅Ρ‰Π΅ Π½Π΅ устали, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ нСбольшой ΠΎΠ±Π·ΠΎΡ€ API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΈ срСдствами синхронизации Π² win32 API. Если Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ смСло ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ этот Ρ€Π°Π·Π΄Π΅Π» πŸ˜‰

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

ΠŸΠΎΡ‚ΠΎΠΊ Π² Win32 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π±Ρ‹Π²Π°Ρ‚ΡŒ Π² состоянии сна (suspend). МоТно Β«ΡƒΡΡ‹ΠΏΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΒ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SuspendThread, ΠΈ Β«Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΡ‚ΡŒΒ» Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° ResumeThread, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ пСрСвСсти Π² состояниС сна ΠΏΡ€ΠΈ создании, установив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π‘reateSuspended Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateThread. НС стоит удивлятся, Ссли Π²Ρ‹ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² кроссплатформСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, Ρ‚ΠΈΠΏΠ° boost::threads ΠΈ QT. ВсС ΠΎΡ‡Π΅Π½ΡŒ просто, pthreads просто Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

БрСдства синхронихации Π² Win32 Π΅ΡΡ‚ΡŒ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ²: Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ β€” это критичСскиС сСкции (critical section), ΠΊ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ относят ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ (mutex), события (event) ΠΈ сСмафоры (semaphore).

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ сСкции β€” лСгковСсный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ синхронизации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ тяТСлых систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Он основан Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈΠ»ΠΈ спин Π»ΠΎΠΊΠΎΠ² (spin lock). ΠŸΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΆΠ΅Π»Π°Π΅Ρ‚ ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ race conditions Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ EnterCliticalSection/TryEnterCriticalSection. Если критичСская сСкция свободна β€” ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΅Π΅, Ссли ΠΆΠ΅ Π½Π΅Ρ‚ β€” ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся (Ρ‚.Π΅. Π½Π΅ выполняСтся ΠΈ Π½Π΅ ΠΎΡ‚ΡŠΠ΅Π΄Π°Π΅Ρ‚ процСссорноС врСмя) Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° сСкция Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСна Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LeaveCriticalSection. Π”Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅, Ρ‚.Π΅. Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π·Π° Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Π°ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… πŸ˜‰

Posix Threads ΠΈΠ»ΠΈ pthreads

Π‘Π»ΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, какая ΠΈΠ· *nix ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ этот стандарт. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ pthreads Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (RTOS), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ (Π²Π΅Ρ€Π½Π΅Π΅ стандарту) β€” ТСстчС. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΠΎΡ‚ΠΎΠΊ pthread Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π±Ρ‹Π²Π°Ρ‚ΡŒ Π² состоянии сна. Π’Π°ΠΊΠΆΠ΅ Π² pthread Π½Π΅Ρ‚ событий, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ β€” условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (conditional variables), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ с Π»ΠΈΡ…Π²ΠΎΠΉ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π½ΡƒΠΆΠ΄Ρ‹.

ΠŸΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± отличиях. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΠΎΡ‚ΠΎΠΊ Π² pthreads ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½ (cancel), Ρ‚.Π΅. просто снят с выполнСния посрСдством систСмного Π²Ρ‹Π·ΠΎΠ²Π° pthread_cancel Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ оТидания освобоТдСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈΠ»ΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния Π²Ρ‹Π·ΠΎΠ²Π° pthread_join (Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ блокируСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΏΡ€ΠΈΠΌΠΈΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция) ΠΈ Ρ‚.Π΄. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ ΠΈ сСмафорами сущСствуСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠ°ΠΊ-Ρ‚ΠΎ pthread_mutex_lock/pthread_mutex_unlock ΠΈ Ρ‚.Π΄.

Conditional variables (cv) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΠ°Ρ€Π΅ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ Π² Π±ΠΎΠ»Π΅Π΅ слоТных случаях. Если ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ просто Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ, Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ освободит Π΅Π³ΠΎ, Ρ‚ΠΎ cv ΡΠΎΠ·Π΄Π°ΡŽΡ‚ условия, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сам сСбя Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ условия Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. НапримСр, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ cv ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ события Π² срСдС pthreads. Π˜Ρ‚Π°ΠΊ, систСмный Π²Ρ‹Π·ΠΎΠ² pthread_cond_wait ΠΆΠ΄Π΅Ρ‚, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ событиС. pthread_cond_signal увСдомляСт ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Ρ‡Ρ‚ΠΎ cv сработала. pthread_cond_broadcast увСдомляСт всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ pthread_cond_wait, Ρ‡Ρ‚ΠΎ сработала cv.

ΠŸΡ€ΠΎΡ‰Π°Π»ΡŒΠ½ΠΎΠ΅ слово

На сСгодня ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ всС, ΠΈΠ½Π°Ρ‡Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ станСт слишком ΠΌΠ½ΠΎΠ³ΠΎ. Для ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ…ΡΡ, Π΅ΡΡ‚ΡŒ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ссылок ΠΈ ΠΊΠ½ΠΈΠ³ Π²Π½ΠΈΠ·Ρƒ πŸ˜‰ Π’Π°ΠΊΠΆΠ΅ высказывайтС своС ΠΌΠ½Π΅Π½ΠΈΠ΅, интСрСсны Π»ΠΈ Π²Π°ΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅.

UPD: Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠ» ΡΡ‚Π°Ρ‚ΡŒΡŽ нСбольшой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ядра ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
UPD2: исправил досадныС ΠΏΡ€ΠΎΠΌΠ°Ρ…ΠΈ ΠΈ ошибки. Бпасибо ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ‚ΠΎΡ€Π°ΠΌ πŸ˜‰

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *