Как реализованы условные переменные? - PullRequest
2 голосов
/ 23 февраля 2010

Это сбило меня с толку надолго.

Учитывая базовые атомарные примитивы, такие как сравнение и своп, я вижу, как реализовать спин-блокировку (из которой я могу создавать мьютексы).

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

1 Ответ

1 голос
/ 23 февраля 2010

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

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

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

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

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

...