2016-08-04 1 views
0

Я пишу порт Windows для приложения Linux, и я пытаюсь найти подходящую замену для pthread_cond_wait(). Ближайшая альтернатива - SleepConditionVariableCS(). Однако я не хочу использовать эту функцию, потому что она использует CriticalSections, которые представляют собой в основном легкие рекурсивные мьютексы. Я бы предпочел вариант нерекурсивного объекта блокировки - есть ли он?Есть ли версия/эквивалент SleepConditionVariableCS(), которая использует нерекурсивный объект mutex (like)?

P.S. -

  1. При применении вместо PTHREAD мьютексов Я использую Semaphores с максимальным числом 1.
  2. Если рекурсивные мьютексы проблематичные as stated by David Butenhof, то почему для Windows обеспечивает только рекурсивные мьютексы (или CriticalSection) как вариант? Является ли это массивным #Fail на части Windows или David Butenhof устаревшим/неправильным?
+0

Среда выполнения параллелизма также предоставляет переменные условия, но вам также не понравятся эти переменные. Рекурсивные блокировки - это всего лишь функция компании с номером поддержки 1-800 и операционной системой, которая делает их * очень дешевыми для создания. Если вы пытаетесь это сделать, потому что считаете, что это будет дешевле, тогда не беспокойтесь. Рассмотрите [Boost] (http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref), чтобы вы чувствовали себя лучше. –

+0

FWIW, вы можете легко преобразовать рекурсивный мьютекс в нерекурсивный. Просто увеличивайте счетчик, когда вы утверждаете мьютекс, убедитесь, что он равен единице, и уменьшите его, когда вы отпустите его. –

ответ

2

Windows Vista, а затем обеспечить Slim Reader/Writer (SRW) Locks как нерекурсивна объекта блокировки альтернативы .

В документации говорится:

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

Переключатель состояния Windows может использовать блокировку SRW вместо блокировки CriticalSection. См. SleepConditionVariableSRW().

: PS. Вот еще один взгляд на хорошее против плохого recursive locks.

+1

Переменные состояния Windows могут использовать блокировку SRW вместо блокировок CriticalSection. См. ['SleepConditionVariableSRW()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686304.aspx). –

+0

@RemyLebeau - Не могли бы вы опубликовать это как отдельный ответ. Это именно то, что я искал. –