Устранение неполадок с очисткой потока C

За последние несколько дней некоторые пользователи сообщили об очистке потока C.

<время><для>PTHREAD_CLEANUP_PUSH (3) Руководство по программированию в Linux PTHREAD_CLEANUP_PUSH (3)

НАЗВАНИЕ вверху

<для> pthread_cleanup_push, pthread_cleanup_pop – запрос и всплывающий поток Менеджер по отмене уборки

СВОДКА вверху

<для> #include

избегайте (* подпрограммы) (void pthread_cleanup_push (void *), избегайте * arg); void pthread_cleanup_pop (int execute); Скомпилируйте и скомпилируйте с -pthread.

ОПИСАНИЕ вверху

<для> Эти функции контролируют стек потоков вызывающего потока. Отмена уборки менеджером. Менеджер по уборке – это любая функция которые начинаются автоматически, когда нить обрезается (или различные другие обстоятельства, описанные ниже); такая сила для Для модели разблокируйте настоящий мьютекс, чтобы сделать его доступным, и другие Это в процессе. Функция pthread_cleanup_push () подталкивает подпрограмму вверх сказочный букет чистящих средств. Когда распорядок будет пересмотрен позже может быть вызван, он принимает аргументы как любой хороший аргумент. Функция Pthread_cleanup_pop () удаляет всю подпрограмму вверху binds также (необязательно) запускает накопление диспетчера очистки, если значение make не равно нулю. Ведение обработчика отката запускается из журнала и проводится в следующих случаях: другой. Когда поток прерывается, любая из чистящих средств сворачивается Обработчики отображаются в дополнение к созданным в обратном порядке в какие компании загружались. один или два. Если какой-то поток заканчивается pthread_exit (3), все Менеджеры по уборке работают хорошо, как описано выше. Raison. (Менеджеры очистки не известны как если бы поток заканчивается тем, что возвращается из начала потока Функция.) 3. Когда поток создает из pthread_cleanup_pop () ненулевую единицу аргумент run отображает диспетчер очистки верхнего уровня и завершенный. POSIX.1 может помочь pthread_cleanup_push () и, следовательно, pthread_cleanup_pop () должны быть реализованы, потому что макросы, которые кажутся раскрытыми в тексте, запускающем ” нажато на ” или по соображениям руководства вызывающий должен сделать это какие именно вызовы этих функций продолжают в них использоваться Функция и выше такой же уровень вложенности предложений. (В других Короче говоря, тренер с самоочисткой доступен только во время Запуск, я бы сказал определение (см. Этот раздел этого конкретного кода). Вызов longjmp (3) (siglongjmp (3)) формирует неопределенный конечный результат, если каждый вызов pthread_cleanup_push () или pthread_cleanup_pop () без координационного вызова, определенного из Буфер перехода был сохранен с помощью setjmp (3) (sigsetjmp (3)). Аналогичным образом longjmp (3) From (siglongjmp (3)) можно использовать в Владелец вверх дает неопределенные результаты, если не было прыжкового щита фактически заполняется с помощью setjmp (3) (sigsetjmp (3)) в диспетчере.

ВОЗВРАТНАЯ СТОИМОСТЬ выше

<для> Эти завершенные функции не возвращают значение функции.

ОШИБКА вверху

<для> Здесь нет никакой ошибки.

АТРИБУТЫ вверху

<для> Для объяснения одного конкретного термина, используемого в этом разделе, я бы сказал: Атрибуты (7). – ~ – – – – – – – – – в том числе – … â “‚ Интерфейс â “‚ Атрибут â “‚ Значение â “‚ площадь – – – в том числе – – – – – 2) – – – – – (пусто) – – – – – 2) – – – – pthread_cleanup_push (), – Безопасность потоков – MT-Safe – â ”‚ pthread_cleanup_pop () ⠔┠⠔ – – – лектронный – – – – – по – – – – – например, – € – – – например, – “-” – – -. – – – – “…….

Вверху MATCH

<для> POSIX.1-2001, POSIX.1-2008.

ПРИМЕЧАНИЯ вверху

<для> В Linux функции pthread_cleanup_push () и pthread_cleanup_pop () Наконец, φ-функции реализованы в виде макросов, которые, по утверждению экспертов, превращаются в текст. ” и после этого ” включены соответственно. Это означает, что, в свою очередь, переменные рассматривается в смысле парных определений многих функций кажутся проверяемыми только до этой степени. POSIX.1 показал, что эффект связан с использованием ROI, break, continue или shift оставьте круглые скобки заранее pthread_cleanup_push () и – или pthread_cleanup_pop () не определены. Этого следует избегать при перемещении приложений.

Высшее

<для> Следующие инструменты предоставляют простой пример используемых методов. Возможности, представленные на этой странице. Компьютерная программа создает их поток который выполняет правый бесконечный цикл, окруженный pthread_cleanup_push () и pthread_cleanup_pop (). Этот цикл увеличивает переменную элемента, один раз cnt, каждую секунду. Согласно аргументам командной строки были принесены к вам, основной провод часто будет распределять другой провод Запрос на отмену, может классифицировать глобальную переменную, которая другой осторожный поток, чтобы выйти из нашего цикла и нормально уйти (время для одного Восстановить). Затем во время программы маскирования основной поток помечается как Отмена технологического запроса к виртуальным потокам: Доллар ./a.out Новое сообщение начато cnt означает 0 cnt = 1 Отбросьте их нить Вызваны помощники по уборке Тема закрыта; cnt переводится как 0 Из вышесказанного многие также могут увидеть, что резьба завершена и Форматировщик был вызван с установкой переопределения, и все сокровища были сброшены глобально изменить cnt напрямую на 0. В следующей настройке наиболее важная основная программа устанавливает серьезную переменную, Заставляет другой поток нормально завершиться: Среднее предложение x Начался другой разговор cnt 0 равно относительно cnt означает 1 Трансляция закончилась нормально; cnt равно 2 Из нового выше мы все видим, что управление очисткой еще не запущено. (поскольку cleanup_pop_arg обычно равен 0), поэтому значение cnt не были сброшены. В нашей следующей итерации основная структура идентифицирует глобальную переменную, позволяет периодически завершать другую линию и возвращает Ненулевое значение по сравнению с cleanup_pop_arg: стр. / вых. 1 Начался новый разговор cnt равно 0 cnt требуется 1 Менеджеры по уборке позвонили Трансляция закончилась нормально; cnt означает 0 Выше мы видим факт, хотя стрим не так давно был отменен, мой менеджер по уборке работал, если учесть каждый из наших аргументов pthread_cleanup_pop () отличен от нуля. Источник, связанный с программой #include

#include # включить #include #include #include #define handle_error_en (en, msg) n человек должен errno = en; Сообщение об ошибке); завершено (EXIT_FAILURE); если человек (0) звуки int done равно 0; звуки int cleanup_pop_arg равно 0; они неактивны int cnt = 0; Тихий cleanup_handler (недопустимый аргумент 5.) printf (“Звонил менеджер по очистке n”); cnt означает 0; Статическое давление * thread_start (недопустимый * аргумент) time_t start, act; printf (“Началась новая трепка n”); pthread_cleanup_push (cleanup_handler, NULL); curr равняется start, подразумевает время (NULL); хотя (! сделано) pthread_testcancel (); / 5. Кнопка отмены * / если получится (curr