Я пишу порт Windows для приложения Linux, и я пытаюсь найти подходящую замену для pthread_cond_wait()
. Ближайшая альтернатива - SleepConditionVariableCS()
. Однако я не хочу использовать эту функцию, потому что она использует CriticalSections, которые представляют собой в основном легкие рекурсивные мьютексы. Я бы предпочел вариант нерекурсивного объекта блокировки - есть ли он?Есть ли версия/эквивалент SleepConditionVariableCS(), которая использует нерекурсивный объект mutex (like)?
P.S. -
- При применении вместо PTHREAD мьютексов Я использую Semaphores с максимальным числом 1.
- Если рекурсивные мьютексы проблематичные as stated by David Butenhof, то почему для Windows обеспечивает только рекурсивные мьютексы (или CriticalSection) как вариант? Является ли это массивным #Fail на части Windows или David Butenhof устаревшим/неправильным?
Среда выполнения параллелизма также предоставляет переменные условия, но вам также не понравятся эти переменные. Рекурсивные блокировки - это всего лишь функция компании с номером поддержки 1-800 и операционной системой, которая делает их * очень дешевыми для создания. Если вы пытаетесь это сделать, потому что считаете, что это будет дешевле, тогда не беспокойтесь. Рассмотрите [Boost] (http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref), чтобы вы чувствовали себя лучше. –
FWIW, вы можете легко преобразовать рекурсивный мьютекс в нерекурсивный. Просто увеличивайте счетчик, когда вы утверждаете мьютекс, убедитесь, что он равен единице, и уменьшите его, когда вы отпустите его. –