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

Если в потоковой библиотеке NPTL размер стека (RLIMIT_STACK) не является неограниченным, он используется по умолчанию при создании новых потоков. Это значение устанавливается до запуска программы, обычно с помощью встроенной команды ulimit — s (которая ограничивает размер стека в командной оболочке С). Для задания ограничения недостаточно вызвать функцию setrlimit() внутри главной программы, поскольку библиотека NPTL определяет размер стека во время инициализации, которая происходит до запуска функции main().


33.2. Потоки и сигналы


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

Эти расхождения между моделями сигналов и потоков приводят к тому, что их совместное использование сопряжено с трудностями и по возможности его следует избегать. Но иногда нам все же приходится работать с сигналами в многопоточных программах. В этом разделе мы обсудим взаимодействие между потоками и сигналами и опишем различные функции, которые могут при этом пригодиться.


33.2.1. Как модель сигналов в UNIX соотносится с потоками

Чтобы понять, как UNIX-сигналы соотносятся с моделью Pthreads, необходимо понимать, какие из аспектов сигнальной модели распространяются на весь процесс (то есть являются общими для всех потоков в процессе), а какие относятся к отдельным потокам. В следующем списке собраны ключевые моменты.

• Назначение сигналов распространяется на весь процесс. Если какой-либо необрабатываемый сигнал с действием остановки или завершения доставляется любому потоку, остановке или завершению подлежат все потоки в этом процессе.

• Действия сигналов распространяются на весь процесс; все потоки в процессе разделяют одно и то же действие для каждого сигнала. Если один поток использует вызов sigaction(), чтобы установить обработчик для какого-нибудь сигнала (например, SIGINT), этот обработчик можно будет вызвать из любого потока, которому доставлен данный сигнал. Аналогично, если один поток решит сделать действие сигнала игнорируемым, этот сигнал будет игнорироваться всеми потоками.

• Сигнал может быть направлен как процессу в целом, так и отдельному потоку. Сигнал направлен в поток, если:

• он сгенерирован в качестве непосредственного результата выполнения определенной аппаратной инструкции в рамках контекста потока (то есть аппаратных исключений SIGBUS, SIGFPE, SIGILL и SIGSEGV; подробности — в разделе 22.4);

• это сигнал SIGPIPE, сгенерированный в момент, когда поток пытался выполнить запись в поврежденный конвейер;

• он был отправлен с помощью функций pthread_kill() или pthread_sigqueue() (описаны в подразделе 33.2.3), которые позволяют потокам одного процесса обмениваться между собой сигналами.

• Все сигналы, сгенерированные другими механизмами, направлены на весь процесс. Например, это могут быть сигналы, отправленные другим процессом с помощью вызовов kill() или sigqueue(); или такие сигналы, как SIGINT и SIGTSTP, генерируемые в момент, когда пользователь нажимает соответствующее сочетание клавиш; или сигналы, сгенерированные для таких программных событий, как изменение размера окна терминала (SIGWINCH) или истечение срока действия таймера (например, SIGALRM).

• Когда сигнал доставляется многопоточному процессу, у которого есть подходящий обработчик, ядро наугад выбирает один поток, чтобы доставить ему этот сигнал и дать возможность его обработать. Такой подход соответствует традиционной семантике сигналов. Обработка одного и того же сигнала несколько раз не имела бы никакого смысла.

• Маска сигнала относится к каждому отдельному потоку (понятия глобальной маски, распространяемой на все потоки в многопоточном процессе, не существует). Потоки могут независимо друг от друга блокировать и разблокировать разные сигналы, используя новую функцию pthread_sigmask(), которая входит в состав программного интерфейса Pthreads. С помощью индивидуальных масок сигнала приложение может контролировать то, какие потоки должны получить сигнал, направленный всему процессу.

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

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

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#.Введите сюда краткую аннотацию

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

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