![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Some basic explanationsBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 16. Boost.Interprocess
|
Механизм |
настойчивость |
---|---|
Общая память |
Ядро или файловая система |
Файл с картой памяти |
Файловая система |
Типы мутексов с разделением процессов |
Процесс |
Семафор, разделяемый процессом |
Процесс |
Условия совместного использования |
Процесс |
Файловый замок |
Процесс |
Очередь сообщений |
Ядро или файловая система |
Назван мутекс |
Ядро или файловая система |
Назван семафор |
Ядро или файловая система |
Названо условие |
Ядро или файловая система |
Как видите,Boost.Interprocessопределяет некоторые механизмы с сохранением «Kernel or Filesystem». Это связано с тем, что POSIX позволяет использовать эту возможность для реализации межпроцессных коммуникаций. Например, можно реализовать общую память с использованием картированных файлов памяти и получить персистентность файловой системы (например, не существует надлежащего известного способа эмулировать персистентность ядра с пользовательской библиотекой для совместно используемой памяти Windows с использованием нативной совместно используемой памяти или персистентность процесса для совместно используемой памяти POSIX, поэтому единственным переносным способом является определение персистентности «Kernel или Filesystem»).
Некоторые межпроцессные механизмы являются анонимными объектами, созданными в общей памяти или файлах с картой памяти, но другие межпроцессные механизмы нуждаются в имени или идентификаторе, чтобы два несвязанных процесса могли использовать один и тот же объект межпроцессного механизма. Примерами этого являются общая память, называемые mutexes и названные семафоры (например, родные окна CreateMutex/CreateSemaphore API).
Название, используемое для идентификации межпроцессного механизма, не является переносимым даже между системами UNIX. По этой причинеBoost.Interprocessограничивает это имя идентификатором переменной C++ или ключевым словом:
НазванныеBoost.Interprocessресурсы (общая память, сопоставленные с памятью файлы, названные mutexes/conditions/semaphores) имеют ядро или устойчивость файловой системы. Это означает, что даже если все процессы, которые открыли эти ресурсы, закончатся, ресурс все равно будет доступен для открытия снова, и ресурс может быть уничтожен только посредством явного вызова их статической функции<remove
>. Это поведение может быть легко понято, так как это тот же механизм, используемый функциями управления открытием / созданием / удалением файлов:
Table 16.2. Boost.Interprocess-Filesystem Analogy
Назван ресурс Interprocess |
Соответствующий std файл |
Соответствующая операция POSIX |
---|---|---|
Конструктор |
std::fstream конструктор |
Открыто |
Разрушитель |
std::fstream-деструктор |
Закрыть |
Член< |
Нет.< |
unlink |
Теперь переписка между POSIX и Boost. Интерпроцесс относительно совместно используемой памяти и названных семафоров:
Table 16.3. Boost.Interprocess-POSIX shared memory
< |
Операция POSIX |
---|---|
Конструктор |
shm_open |
Разрушитель |
Закрыть |
Член< |
shm_unlink |
Table 16.4. Boost.Interprocess-POSIX named semaphore
< |
Операция POSIX |
---|---|
Конструктор |
sem_open |
Разрушитель |
Закрыть |
Член< |
sem_unlink |
Наиболее важным свойством является то, чтодеструкторы названных ресурсов не удаляют ресурс из системы, они только освобождают ресурсы, выделенные системой для использования процессом для названного ресурса.Для удаления ресурса из системы программист должен использовать<remove
>.
Названы ресурсы, предлагаемыеBoost.Interprocessдолжен справляться с проблемами разрешения, зависящими от платформы, также присутствующими при создании файлов. Если программист хочет совместно использовать общую память, отображать файлы памяти или называть механизмы синхронизации (мутексы, семафоры и т. д.) между пользователями, необходимо указать эти разрешения. К сожалению, традиционные разрешения UNIX и Windows очень разные иBoost.Interprocessне пытается стандартизировать разрешения, но не игнорирует их.
Все названные функции создания ресурсов имеют опциональную функцию<permissions
object
>, которая может быть настроена с разрешениями, зависящими от платформы.
Поскольку каждый механизм можно эмулировать с помощью диферентных механизмов (семафор может быть реализован с использованием отображенных файлов или нативных семафоров), типы разрешений могут варьироваться, когда реализация названных изменений ресурса (например: в мутексах Windows требуется<synchronizepermissions
>, но это не относится к файлам). Чтобы избежать этогоBoost.Interprocessполагается на разрешения, подобные файлам, требующие разрешений на чтение-запись-удаление файлов для открытия именованных механизмов синхронизации (мутекс, семафоры и т. д.) и аппропиатных разрешений на чтение или чтение-запись-удаление для совместно используемой памяти. Этот подход имеет два преимущества: он похож на философию UNIX и программисту не нужно знать, как реализуется названный ресурс.
Статья Some basic explanations раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 16. Boost.Interprocess может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 16. Boost.Interprocess ::
реклама |