Программирование для 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
Чай и водка в истории России
Дом и Семья:
кулинария
рейтинг книги
Старый тракт (сборник)
Сибириада
Проза:
современная проза
рейтинг книги
Александр Агренев. Трилогия
Александр Агренев
Фантастика:
альтернативная история
рейтинг книги
Тринадцатый II
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Газлайтер. Том 6
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
рейтинг книги
После Кастанеды: дальнейшее исследование
Религия и эзотерика:
эзотерика
рейтинг книги