Внедрение переменных условия для CRITICAL_SECTIONs для Winthreads для XP

У меня есть желание для переменных состояния стиля POSIX на Win32. У меня есть код, который нужно запускать на XP, поэтому я не могу использовать Vista/Server 2008 CONDITION_VARIABLE.

В настоящее время он использует класс переменных псевдословного условия, который основан на выходе из критического раздела и сигнализирует событие auto reset для сигнализации/пробуждения. Для ожидания переменной условия она оставляет критический раздел, WaitForSingleObject в событии, а затем возвращается в критический раздел. Это в основном прекрасно, но оно не поддерживает трансляцию, и может иметь другие проблемы в отношении справедливости, о которых я не слишком беспокоюсь.

Мы используем boost, поэтому я знаю, что могу использовать boost-потоки или pthreads-win32, которые поддерживают переменные условий, но в идеале я бы хотел, чтобы интерфейс был таким, что я могу отказаться от реализации Microsoft, когда/можно использовать его напрямую. Я видел Стратегии для внедрения переменных состояния POSIX в Win32, но "лучшее" (самое правильное) решение использует Mutex, а не CRITICAL_SECTION, Существует эскиз реализации с CRITICAL_SECTION в второй части, но он не является полным, а другие решения с CRITICAL_SECTION беспокоят меня из-за проблем, изложенных для них в статье.

Короче говоря, как мне реализовать правильную, не обязательно справедливую (но это было бы хорошо), переменную условия на win32 для критических разделов, чтобы я мог отказаться от реализации Microsoft, когда она станет доступной мне?

Ответ 1

Документы, на которые вы ссылаетесь, были написаны моими коллегами как результат нашей работы над картой ACE С++ и ее оберточными фасадами OS. Как уже упоминалось в моей биографии, "я не делаю Windows", но я все еще активно работаю над ACE, и я просто посмотрел, и, похоже, что реализация переменной условия для Win32 использует CRITICAL_SECTION (при первоначальном осмотре она выглядит например, просто используя мьютекс, но если вы копаете глубже, вы обнаружите, что есть слой ниже, в котором мьютекс определен как CRITICAL_SECTION на платформах Windows).

FYI, чтобы гарантировать, что код не был изменен для использования новых API-интерфейсов Vista, база кода, которую я проверила, фактически является ветвью от строки 1.5.

Предполагая, что вам просто нужен C API для переменных условия, а не обертки С++ вокруг него, все это должно содержаться в одном наборе файлов: ace/OS_NS_Thread.{h,inl,cpp} Лицензия на ACE очень щедрая, а не GPL, поэтому вы может поднять код оттуда в проприетарную базу кода, не опасаясь "загрязнения GPL".

Вы можете получить релизы ACE в http://download.dre.vanderbilt.edu/; проверенная версия - это коммерчески поддерживаемый релиз, полученный из ACE 5.5.2, поддерживаемый OCI и доступны для загрузки на http://www.theaceorb.com/downloads/1.5a/index.html.

В интересах полного раскрытия я был давним пользователем/вкладчиком/сопровождающим в ACE, некоторое время работал над этим исследовательским персоналом и теперь являюсь сотрудником OCI. Я не думаю, что это изменяет полезность/применимость этого кода для вас, и ни один из вышеупомянутых лиц не получает доход от вас, переставляя код из источника.