Реализация условных переменных для CRITICAL_SECTION для Winthreads для XP - PullRequest
10 голосов
/ 02 августа 2009

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

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

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

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

1 Ответ

6 голосов
/ 05 августа 2009

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

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

Предполагая, что вам просто нужен C API для условных переменных, а не обертки C ++ вокруг него, все это должно содержаться в одном наборе файлов: 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. Я не думаю, что это меняет полезность / применимость этого кода для вас, и ни одна из вышеупомянутых организаций не получает доход от того, что вы забираете код из источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...