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

Уничтожение анонимного семафора должно происходить до освобождения занимаемой им памяти. Например, если семафор является автоматически выделяемой переменной, то должен быть уничтожен до возвращения функции, в которой был создан. При нахождении семафора на участке разделяемой памяти POSIX его нужно удалить после того, как он перестает использоваться каким-либо процессом, но перед удалением объекта разделяемой памяти с помощью функции shm_unlink().

Часть систем позволяют пропустить вызов sem_destroy() без каких-либо проблем. Но существуют реализации, в которых это может привести к утечке ресурсов. Чтобы исключить такую возможность, портируемые приложения должны вызывать sem_destroy().


49.5. Сравнение POSIX-семафоров с мьютексами из библиотеки Pthreads


И POSIX-семафоры, и Pthreads-мьютексы могут использоваться для синхронизации потоков в рамках одного и того же процесса. Они мало чем отличаются с точки зрения производительности, однако мьютексы являются более предпочтительными, поскольку поддерживают атрибут, указывающий на владельца, что располагает к лучшему структурированию кода (только поток, закрывший мьютекс, может его открыть). Для сравнения, семафор можно инкрементировать из потока, который его не инкрементировал. Такая гибкость может стать причиной неудачной архитектуры приложения (именно поэтому семафоры иногда называют аналогом инструкции goto в параллельном программировании).

Существует один сценарий, в котором мьютексы не подходят для использования в многопоточном приложении и могут быть заменены семафорами. Функция sem_post() является безопасной для вызова в асинхронных сигналах (см. табл. 21.1), поэтому ее можно задействовать внутри обработчика сигнала для синхронизации с другим потоком. Мьютексы этого не позволяют, так как соответствующие функции библиотеки Pthreads небезопасны с точки зрения асинхронных сигналов. Однако данное преимущество семафоров редко оказывается востребованным, потому что асинхронные сигналы рекомендуется принимать в вызовах наподобие sigwaitinfo(), а не в самих обработчиках (см. подраздел 33.2.4).


49.6. Ограничения, связанные с семафорами


В стандарте SUSv3 описано два ограничения, налагаемых на семафоры.

• SEM_NSEMS_MAX — это максимальное количество POSIX-семафоров, которые могут быть у одного процесса. В стандарте SUSv3 указано, что данное значение должно быть не меньше 256. В Linux количество семафоров ограничивается только объемом доступной памяти.

• SEM_VALUE_MAX — это максимальное значение, которого может достигнуть POSIX-семафор. Семафоры могут быть равны любому числу от 0 до SEM_VALUE_MAX. Стандарт SUSv3 требует, чтобы данное ограничение было не меньше 32 767; в Linux он равен INT_MAX (2 147 483 647 в Linux/x86-32).


49.7. Резюме


POSIX-семафоры позволяют синхронизировать действия потоков или процессов. Они бывают двух видов: именованные и анонимные. Именованный семафор идентифицируется по имени и может разделяться между любыми процессами, у которых есть права на его открытие. Анонимный не имеет имени; для его разделения процессы или потоки должны поместить его на участок памяти, являющийся для них общим. В случае с процессами это может быть объект разделяемой памяти POSIX, а с потоками — глобальная переменная.

Интерфейс POSIX-семафоров отличается простотой. Выделение семафоров и работа с ними происходит на индивидуальном уровне, а инкрементация и декрементация изменяет их значение на 1.

POSIX-семафоры имеют ряд преимуществ перед своими аналогами из System V, но их сложнее переносить на другие системы. Для синхронизации в рамках многопоточных приложений более предпочтительными обычно являются мьютексы.


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

В [Stevens, 1999] приводится альтернативный взгляд на POSIX-семафоры и описывается их реализация в пользовательском пространстве на основе других IPC-механизмов (очередей FIFO, файлов, отображенных в память, и семафоров System V). Использование POSIX-семафоров в многопоточных приложениях демонстрируется в [Butenhof, 1996].


49.8. Упражнение


49.1. Отредактируйте программу из листинга 49.3 (psem_wait.c), заменив sem_wait() функцией sem_timedwait(). Программа должна принимать дополнительный аргумент командной строки, который определяет относительное время ожидания вызова sem_timedwait() (в секундах).

50. Разделяемая память POSIX

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

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

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

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

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

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