2010-02-23 6 views
2

Это меня озадачило давно.Как реализованы переменные условий?

Данные базовые атомные примитивы, такие как сравнение & swap, я могу видеть, как реализовать блокировку вращения (из которой я могу построить мьютексы).

Однако я не вижу, как я могу построить переменные условия из этого. Как это делается?

ответ

2

Это не особенно просто. Ниже приведена ссылка на документ Дугласа Шмидта (который также в значительной степени отвечает за библиотеки ACE), который описывает несколько подходов к реализации переменных условий в Windows с использованием примитивов синхронизации, доступных в Win32 (pre-Vista). Подходы включают использование только основные, как правило, доступны на любых примитивов ОС, и обсуждает различные ограничения подходов:

Нижняя строка (заключительные замечания):

Эта статья иллюстрирует, почему разработка переменных условия на платформах Win32 является сложной и подверженной ошибкам. Разработчики нуждаются в нескольких тонких конструктивных силах. В целом, различные реализации, которые мы рассмотрели, различаются в зависимости от их правильности, эффективности, справедливости и переносимости. Ни одно решение не обеспечивает все эти качества оптимально.

Решение SignalObjectsAndWait в Разделе 3.4 является хорошим подходом, если справедливость имеет первостепенное значение. Однако этот подход не так эффективен, как другие решения, и он не переносится. Поэтому, если эффективность или переносимость важнее справедливости, подход SetEvent, описанный в разделе 3.2, может быть более подходящим. Естественно, самым простым решением было бы просто предоставить Microsoft переменные условий в Win32 API.

Обратите внимание, что начиная с Vista, Windows, поддерживает переменные условия с использованием собственного API: