Mutex, Windows 10, c ++, Получить в одном потоке, выпустить в другом - PullRequest
0 голосов
/ 19 сентября 2018

Я знаю, как обычно работают мьютексы в Windows.И да, конечно, я мог бы создать тестовую программу, чтобы узнать результаты, мне просто интересно, знает ли кто-нибудь, прежде чем я это напишу.

Я видел IDXGIKeyedMutex в документации сегодня.У него есть странный метод вызова, когда вы можете вызвать два метода: Acquire (Key) и Release (Key).Acquire ожидает получения «мьютекса» (общего ресурса), связанного с ключом, независимо от того, в каком потоке он находится.Release освобождает общий ресурс независимо от того, в каком потоке он находится.Ожидается, что ни один поток вызовов в Acquire не приведет к тому, что Acquire будет вызван более одного раза, прежде чем будет вызван соответствующий Release (для того же ключа).

Таким способом можно создать производителя / потребителя с блокировкой, например: Производитель: Получить (0), записать общий ресурс, Выпуск (1) Потребитель: Получить (1), прочитать общий ресурс,Релиз (0)

Это заставило меня задуматься: можно ли использовать мьютексы Windows таким образом, хотя это не задокументировано?Что, если я создаю мьютекс для двух процессов и делюсь им обоими, вызываю WaitForSingleObject (m_hMutex, INFINITE) в одном процессе и вызываю ReleaseMutex (m_hMutex) в другом процессе?Я предполагаю, что это не работает?Или так, но никто так не использует?

1 Ответ

0 голосов
/ 19 сентября 2018

Нет, этого нельзя сделать по простой причине: для сохранения взаимного исключения

Я думаю, вы неправильно поняли IDXGIKeyedMutex.Документация по методу Release просто гласит:

Возвращаемое значение

Возвращает S_OK в случае успеха.

Если устройство попыталось освободить мьютекс с ключом, который не являетсяДействительный или принадлежащий устройству, ReleaseSync возвращает E_FAIL.

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

...