Читаем Linux API. Исчерпывающее руководство полностью

Проблема с асинхронной отменой заключается в том, что, хотя обработчики очистки ресурсов по-прежнему запускаются, они не могут определить состояние потока. В программе из листинга 32.2, в которой применяется отложенная отмена, поток может быть отменен только при вызове pthread_cond_wait() — единственной точки отмены. На этом этапе мы уже знаем, что переменная buf уже была инициализирована с помощью адреса блока выделенной памяти и что мьютекс mtx был закрыт. Но асинхронная отмена может произойти в любой момент; например, между вызовом malloc() и закрытием мьютекса или до/после этих событий. Обработчик очистки ресурсов не может узнать, где именно произошла отмена или какие именно ресурсы нужно освободить. Более того, поток может быть отменен даже во время вызова malloc(), что, скорее всего, приведет к непредвиденным результатам (см. подраздел 7.1.3).

В целом, асинхронно отменяемые потоки не могут выделять никаких ресурсов или владеть мьютексами, семафорами или блокировками. Это делает невозможным использование целого ряда библиотечных функций, включая большую часть содержимого библиотеки Pthreads (для функций pthread_cancel(), pthread_setcancelstate() и pthread_setcanceltype() в стандарте SUSv3 сделано исключение, так как они обязаны быть безопасными в условиях асинхронной отмены; то есть они должны быть реализованы так, чтобы их можно было безопасно вызывать из асинхронно отменяемого потока). Иными словами, существует несколько случаев, когда асинхронная отмена может оказаться полезной. Это, например, относится к отмене потока, находящегося в вычислительном цикле.


32.7. Резюме


Функция pthread_cancel() позволяет потокам отправлять друг другу запрос отмены, в результате которого поток должен быть завершен.

Реакцию потока на полученный запрос определяет его состояние и тип отмены. Если поток нельзя отменить, запрос будет отложен до тех пор, пока состояние потока не измениться. Если поток является отменяемым, реакция на запрос определяется типом его отмены. Если отмена отложенная, поток будет отменен при достижении одной из функций, которые определены стандартом SUSv3 в качестве точек отмены. Если отмена асинхронная, поток может быть отменен в любой момент (что редко бывает полезным).

Поток может иметь стек обработчиков для освобождения ресурсов; это функции, объявляемые программистом, которые в случае отмены потока автоматически вызываются для проведения очистки (то есть для восстановления состояния разделяемых переменных или открытия мьютексов).


Дополнительная информация

Ознакомьтесь с источниками, приведенными в разделе 29.10.

33. Потоки выполнения: дальнейшие подробности

В этой главе продолжается рассмотрение различных аспектов POSIX-потоков. Мы обсудим их взаимодействие в контексте традиционных программных интерфейсов UNIX — в частности, с помощью сигналов и средств управления процессами (fork(), exec() и _exit()). Здесь также будет представлен краткий обзор двух реализаций POSIX-потоков, доступных в Linux, — LinuxThreads и NPTL и их расхождения со спецификацией Pthreads, описанной в стандарте SUSv3.


33.1. Стеки потоков


Каждый поток имеет свой собственный стек фиксированного размера, который определяется при его создании. На платформе Linux/x86-32 размер стека во всех потоках, кроме главного, по умолчанию равен 2 Мбайт (в некоторых 64-битных архитектурах стандартный размер выше; например, в системах IA-64 он достигает 32 Мбайт). Главному потоку под стек выделяется намного больше места (см. рис. 29.1).

Иногда бывает полезно изменить размер стека, принадлежащего потоку. Это делается с помощью функции pthread_attr_setstacksize(), которая устанавливает атрибут потока (см. раздел 29.8), определяющий размер стека. Связанная с ней функция pthread_attr_setstack() позволяет управлять как размером, так и местоположением стека, хотя изменение последнего может негативно сказаться на переносимости приложения. Подробности об этих функциях ищите на их справочных страницах.

Изменение размера стека, принадлежащего потоку, может понадобиться в случаях, когда потоку нужно выделять большие автоматические переменные или выполнять вложенные вызовы функций большой глубины (возможно, в результате рекурсии). Приложение также может уменьшить размер стека, чтобы иметь возможность создать большее количество потоков в рамках одного процесса. Например, на платформе x86-32 виртуальное адресное пространство, доступное пользователю, ограничено размером 3 Гбайт, а стандартный объем стека равен 2 Мбайт; следовательно, мы можем создать около 1500 потоков (точное число зависит от того, сколько виртуальной памяти выделено на сегменты с текстом и данными, на разделяемые библиотеки и т. д.). Минимальный размер стека, доступный в текущей системе, можно узнать с помощью вызова sysconf(_SC_THREAD_STACK_MIN). Для библиотеки NPTL на платформе Linux/x86-32 это значение равно 16384.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных