Помещение мьютекса в файл с отображенной памятью в Windows в C / Stack Overflow

Предлагает ли Windows какой-либо мьютекс, который можно поместить в файл с отображением в памяти и использовать в нескольких процессах?

В идеале он должен быть полностью автономным, чтобы он мог выжить сам по себе в файле даже после перезагрузки.
Кроме того, не должно быть утечки ресурсов, если я просто удаляю файл вручную, пока не запущены никакие процессы.

Если возможно, решение должно также предлагать сопутствующую концепцию «условия», которая также должна представлять собой объект, который может находиться в отображенном файле совместно используемой памяти.

Короче говоря, мне нужно что-то похожее на мьютекс PTHREADS с атрибутом SHARED.

Насколько я понимаю, простое использование мьютекса PTHREADS невозможно, поскольку атрибут SHARED не поддерживается в порте Windows PTHREADS.

3

Решение

Для совместного использования объекта синхронизации присвойте ему имя и используйте одно и то же имя в каждом процессе при создании объекта.

Таким образом, следующие процессы синхронизации могут быть разделены между процессами:

Критические разделы не могут быть разделены, но быстрее.

Тестирование или ожидание этих объектов выполняется с помощью семейства функций ожидания, часто WaitForMultipleObjects.

2

Другие решения

Используйте файл в качестве своего собственного мьютекса: используйте LockFileEx и пусть все согласятся заблокировать байт 0 файла, когда они захотят получить мьютекс.

2

Это невозможно. Сам объект мьютекса живет в пространстве ядра, чтобы защитить его от вмешательства пользовательского кода в его состояние. Полученный вами дескриптор действителен только для процесса, который его приобрел. Технически вы можете использовать DuplicateHandle () и поместить возвращенный дескриптор в mmf, но только если у вас есть дескриптор другого процесса, который обращается к разделу памяти. Это довольно хрупко.

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

1
По вопросам рекламы [email protected]