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

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

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

Для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция pthread_exit () Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ value_ptr пСрСдаСтся ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_join() для этого ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π•Ρ‰Π΅ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, связанныС с Β«ΡƒΠ±ΠΎΡ€ΠΊΠΎΠΉΒ», Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ вмСстС с дСструкторами, прСдусмотрСнными для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. НикакиС рСсурсы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, ΠΏΡ€ΠΈ этом Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ.

Бинопсис

#include <pthread.h>

int pthread_exit(void *value_ptr);

ΠŸΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ послСднСго ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² процСссС Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ сам процСсс со статусом Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Ρ€Π°Π²Π½Ρ‹ΠΌ 0. Π­Ρ‚Π° функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈ Π½Π΅ опрСдСляСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΊΠΎΠ΄ΠΎΠ² ошибок.

Для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ адрСсного пространства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция pthread__cancel (). ΠžΡ‚ΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ задаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ thread.

Бинопсис

#include <pthread.h>

int pthread_cancel(pthread_t thread);

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

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

БостояниС готовности ΠΊ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ (cancelability state) описываСт условия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ (ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚) Π±Ρ‹Ρ‚ΡŒ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½. Π’ΠΈΠΏ аннулирования (cancelabilty type) ΠΏΠΎΡ‚ΠΎΠΊΠ° опрСдСляСт ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ послС получСния запросов Π½Π° Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π°Π½Π½ΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ запрос Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈΠ»ΠΈ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ) Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. БостояниС готовности ΠΊ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ Ρ‚ΠΈΠΏ аннулирования ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ динамичСски самим ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

Для опрСдСлСния состояния готовности ΠΊ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ Ρ‚ΠΈΠΏΠ° аннулирования Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ p thread_setcancelstate() pthread_setcanceltype(). Ѐункция pthread_setcancelstate() устанавливаСт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² состояниС, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ state, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ состояниС Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ oldstate.

Бинопсис

#include <pthread.h>

int pthread_setcancelstate(int state, int *oldstate);

int pthread_setcanceltype(int type, int *oldtype);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ state ΠΈ oldstate ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ значСния:

PTHREAD_CANCEL_DISABLE

PTHREAD_CANCEL_ENABLE

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CANCEL_DISABLE опрСдСляСт состояниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запрос Π½Π° Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CANCEL_ENABLE - состояниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊ «согласится» Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ запрос (это состояниС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ устанавливаСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°). ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число 0 , Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ΠΊΠΎΠ΄ ошибки. Ѐункция pthread_setcancelstate() Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅

Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° state окаТСтся Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Ѐункция pthread_setcanceltype () устанавливаСт для Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΈΠΏ аннулирования, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ type, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ oldtype. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ type ΠΈ oldtype ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ значСния:

PTHREAD_CANCEL_DEFFERED

PTHREAD_ASYNCHRONOUS

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CANCEL_DEFFERED опрСдСляСт Ρ‚ΠΈΠΏ аннулирования, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ достигнСт Ρ‚ΠΎΡ‡ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅Π³ΠΎ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (этот Ρ‚ΠΈΠΏ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ устанавливаСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PTHREAD_CANCEL_ASYNCHRONOUS опрСдСляСт Ρ‚ΠΈΠΏ аннулирования, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число 0 , Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС— ΠΊΠΎΠ΄ ошибки. Ѐункция pthread_setcanceltype() Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° type окаТСтся Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_setcancelstate() ΠΈ pthread_setcanceltype() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ вмСстС для установки ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ запросу Π½Π° Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ состояния ΠΈ Ρ‚ΠΈΠΏΠ° аннулирования пСрСчислСны ΠΈ описаны Π² Ρ‚Π°Π±Π». 4 .5.

Π’Π°Π±Π»ΠΈΡ†Π° 4.5. ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ состояния ΠΈ Ρ‚ΠΈΠΏΠ° аннулирования

БостояниС Β  Π’ΠΈΠΏ Β  ОписаниС

PTHREAD_CANCEL_ENABLE (PTHREAD_CANCEL_DEFERRED) ΠžΡ‚ΡΡ€ΠΎΡ‡Π΅Π½Π½ΠΎΠ΅ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π­Ρ‚ΠΈ состояниС ΠΈ Ρ‚ΠΈΠΏ аннулирования ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. АннулированиС ΠΏΠΎΡ‚ΠΎΠΊΠ° происходит, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ достигаСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² своСм Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° программист опрСдСляСт Ρ‚ΠΎΡ‡ΠΊΡƒ аннулирования с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_testcancel()

PTHREAD_CANCEL_ENABLE (PTHREAD_CANCEL_ASYNCHRONOUS)

АсинхронноС Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. АннулированиС ΠΏΠΎΡ‚ΠΎΠΊΠ° происходит Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ

PTHREAD_CANCEL_DISABLE (любоС)

АннулированиС Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ. Оно Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ выполняСтся

Π’ΠΎΡ‡ΠΊΠΈ аннулирования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

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

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