Никто не упомянул об этом, но sem_open()
создает настоящий именованный семафор под современными POSIX-совместимыми ОС.Если вы присвоите семафору начальное значение 1, он станет мьютексом (если он строго освобожден, только если блокировка была успешно получена).
С несколькими объектами на основе sem_open()
вы можете создатьвсе общие эквивалентные именованные объекты Windows - именованные мьютексы, именованные семафоры и именованные события.Именованные события с «ручным» значением true немного сложнее эмулировать (для правильной эмуляции CreateEvent()
, SetEvent()
и ResetEvent()
требуется четыре объекта семафора).Во всяком случае, я отвлекся.
В качестве альтернативы, там есть общая память.Вы можете инициализировать мьютекс pthread с атрибутом «общий процесс» в именованной общей памяти, и тогда все процессы смогут безопасно получить доступ к этому объекту мьютекса после открытия дескриптора общей памяти с помощью shm_open()
/ mmap()
.sem_open()
проще, если он доступен для вашей платформы (если это не так, это должно быть ради здравомыслия).
Независимо от используемого вами метода, для тестирования одного экземпляра вашего приложения,используйте trylock()
вариант функции ожидания (например, sem_trywait()
).Если процесс запущен только один раз, он успешно заблокирует мьютекс.Если это не так, он немедленно завершится ошибкой.
Не забудьте разблокировать и закрыть мьютекс при выходе из приложения.