Программирование для Linux. Профессиональный подход
Шрифт:
Чаще всего взаимоблокировка возникает, когда группа потоков пытается захватить один и тот же набор объектов. Рассмотрим, к примеру, программу, в которой два потока, выполняющих разные потоковые функции, должны захватить одни и те же два исключающих семафора. Предположим, ноток А захватывает сначала семафор 1, а затем семафор 2, в то время как поток Б захватывает семафоры в обратном порядке. Возможна достаточно неприятная ситуация, когда после захвата семафора 1 потоком А операционная система активизирует поток Б, который захватит поток 2. Далее оба потока окажутся заблокированными, так как им будет закрыт доступ к семафорам друг друга.
Это пример более общей проблемы взаимоблокировки, которая касается не только объектов синхронизации, таких как исключающие семафоры, но и ряда других ресурсов, в частности блокировок файлов и устройств. Проблема возникает, когда потоки пытаются захватить один и тот же набор ресурсов, но в разной последовательности. Выход заключается в том, чтобы обеспечить согласованный протокол доступа к ресурсам во всех потоках.
4.5. Реализация потоков в Linux
Потоковые функции, соответствующие стандарту POSIX, реализованы в Linux не так, как в большинстве других версий UNIX. Суть в том, что в Linux потоки реализованы в виде процессов. Когда вызывается функция
Сказанное иллюстрирует программа
Запустите программу в фоновом режиме, а затем вызовите команду
Строки, начинающиеся с записи
Обратите внимание на то, что программе
4.5.1. Обработка сигналов
Предположим, что многопотоковая программа принимает сигнал. В каком потоке будет вызван обработчик сигнала? Это зависит от версии UNIX. В Linux поведение программы объясняется тем. что потоки на самом деле реализуются в виде процессов.
Каждый поток в Linux является отдельным процессом, а сигнал доставляется конкретному процессу, поэтому никакой неоднозначности на самом деле нет. Обычно сигнал, поступающий от внешней программы, посылается процессу, управляющему главным потоком программы. Например, если программа с помощью функции
Тем не менее подобная особенность реализации библиотеки Pthreads в Linux не согласуется со стандартом POSIX. Нельзя полагаться на нее в программах, рассчитанных на то, чтобы быть переносимыми.
В многопотоковой программе один поток может послать сигнал другому. Для этого предназначена функция
4.5.2. Системный вызов clone
Боярышня Дуняша 2
2. Боярышня
Любовные романы:
любовно-фантастические романы
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
рейтинг книги
Последний Паладин. Том 14
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
рейтинг книги
Возлюби болезнь свою
Научно-образовательная:
психология
рейтинг книги