Книга: Программирование для Linux. Профессиональный подход
4.2.2. Неотменяемые потоки
4.2.2. Неотменяемые потоки
Поток может вообще отказаться удаляться, вызвав функцию pthread_setcancelstate()
. Как и в случае функции pthread_setcanceltype()
, это оказывает влияние только на вызывающий поток. Первый аргумент функции должен быть PTHREAD_CANCEL_DISABLE
, если нужно запретить отмену потока, и PTHREAD_CANCEL_ENABLE
в противном случае. Второй аргумент — это указатель на переменную, в которую записывается предыдущее состояние потока.
Вот как можно запретить отмену потока:
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
Функция pthread_setcancelstate()
позволяет организовывать критические секции. Критической секцией называется участок программы, который должен быть либо выполнен целиком, либо вообще не выполнен. Другими словами, если поток входит в критическую секцию, он во что бы то ни стало должен дойти до ее конца.
Предположим, к примеру, что для банковской программы требуется написать функцию, осуществляющую перевод денег с одного счета на другой. Для этого нужно добавить заданную сумму на баланс одного счета и вычесть аналогичную сумму с баланса другого счета. Если между этими двумя операциями произойдет отмена потока, выполняющего функцию, программа ложно увеличит суммарный депозит банка вследствие незавершенной транзакции. Чтобы этого не случилось, обе операции должны выполняться в критической секции.
В листинге 4.6 показан пример функции process_transaction()
, осуществляющей данную задумку. Функция запрещает отмену потока до тех пор, пока баланс обоих счетов не будет изменен.
- Стандартные потоки: stdin, stdout, stdeir, stdaux, stdprn.
- 1.2 Процесс, контекст процесса и потоки
- Потоки в пространстве ядра
- Структура mm_struct и потоки пространства ядра
- ГЛABA 6 Процессы, потоки и задания
- ГЛАВА 7 Потоки и планирование выполнения
- Процессы и потоки Windows
- Удаленные потоки
- Потоки и производительность
- Облегченные потоки
- Гиперпотоки и счетчик процессоров
- 12. Лекция: Потоки выполнения. Синхронизация