Windows Mutex, кажется, позволяет полученной блокировке быть полученной снова (рекурсивно), если поток, в настоящее время владеющий блокировкой, пытается получить его.
Но, posix базировался, блокировки pthread не позволяют такое поведение.
Там какое-либо время компиляции является макросом или какими-либо настройками, которые могут заставить взаимное исключение окон вести себя таким же образом как pthread взаимное исключение?
Пока вы программируете в Windows, избегайте переопределения поведения его Мьютекса. Его повторный вход одним и тем же потоком абсолютно необходим для заданного поведения.
Объект синхронизации без сродства с потоком - это семафор, счетчик которого равен 1. Используйте CreateSemaphore().
Fwiw, очень любопытно, что вам нужно такое поведение. Похоже, что вы пытаетесь использовать один и тот же объект синхронизации в нескольких местах неподобающим образом. Вы можете использовать семафор, но потеряете параллельный потенциал. Подумайте об использовании нескольких мьютексов вместо этого.
Посмотрите на эту статью в разделе "Быстрый мьютекс" .
Этот тип мьютексов не может быть рекурсивно приобретен.
Конечно, вам нужно будет рассмотреть, как реализовать их в C.
.Нельзя изменить тот факт, что Windows Mutexes являются рекурсивными. И хотя по умолчанию Posix потоков не являются рекурсивными, вы можете использовать pthread_mutexattr_settype()
с флагом PTHREAD_MUTEX_RECURSIVE
, чтобы сделать его рекурсивным.
Блокировка мьютекса в Windows на самом деле является довольно дорогой операцией, и лучше всего подходит для межпроцессной синхронизации. Для мьютекса, используемого только в рамках одного процесса, обычно используется критическая секция, однако они также возвращаются. В качестве состояния nobugz, для получения не рекурсивной синхронизации необходимо использовать семафор, инициализированный с максимальным числом 1.
Объект в семафоре похож на специальный счетчик, который может быть атомически увеличен и уменьшен в потоках (или процессах, если они созданы совместно). Создавая семафорный объект с максимальным счётом 1, вы получаете требуемое нерекурсивное поведение.