Как изменить рекурсивное поведение при блокировании Windows Mutex?

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

Но, posix базировался, блокировки pthread не позволяют такое поведение.

Там какое-либо время компиляции является макросом или какими-либо настройками, которые могут заставить взаимное исключение окон вести себя таким же образом как pthread взаимное исключение?

7
задан Jay 1 January 2010 в 10:44
поделиться

3 ответа

Пока вы программируете в Windows, избегайте переопределения поведения его Мьютекса. Его повторный вход одним и тем же потоком абсолютно необходим для заданного поведения.

Объект синхронизации без сродства с потоком - это семафор, счетчик которого равен 1. Используйте CreateSemaphore().

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

8
ответ дан 6 December 2019 в 10:50
поделиться

Посмотрите на эту статью в разделе "Быстрый мьютекс" .

Этот тип мьютексов не может быть рекурсивно приобретен.

Конечно, вам нужно будет рассмотреть, как реализовать их в C.

.
0
ответ дан 6 December 2019 в 10:50
поделиться

Нельзя изменить тот факт, что Windows Mutexes являются рекурсивными. И хотя по умолчанию Posix потоков не являются рекурсивными, вы можете использовать pthread_mutexattr_settype() с флагом PTHREAD_MUTEX_RECURSIVE, чтобы сделать его рекурсивным.

Блокировка мьютекса в Windows на самом деле является довольно дорогой операцией, и лучше всего подходит для межпроцессной синхронизации. Для мьютекса, используемого только в рамках одного процесса, обычно используется критическая секция, однако они также возвращаются. В качестве состояния nobugz, для получения не рекурсивной синхронизации необходимо использовать семафор, инициализированный с максимальным числом 1.

Объект в семафоре похож на специальный счетчик, который может быть атомически увеличен и уменьшен в потоках (или процессах, если они созданы совместно). Создавая семафорный объект с максимальным счётом 1, вы получаете требуемое нерекурсивное поведение.

8
ответ дан 6 December 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: