Как реализованы условные переменные?
Это сбило меня с толку надолго.
Учитывая базовые атомарные примитивы, такие как сравнение и своп, я вижу, как реализовать спин-блокировку (из которой я могу создавать мьютексы).
Тем не менее, я не понимаю, как я могу построить условные переменные из этого. Как это сделать?
1 ответ
Это не особенно просто. Ниже приведена ссылка на статью Дугласа Шмидта (который также в значительной степени отвечает за библиотеки ACE), в котором подробно описываются несколько подходов к реализации переменных условий в Windows с использованием примитивов синхронизации, доступных в Win32 (до Vista). Подходы включают использование только базовых, общедоступных на любых примитивах ОС, и обсуждают различные ограничения подходов:
Суть (заключительные замечания):
В этой статье показано, почему разработка переменных условий на платформах Win32 сложна и подвержена ошибкам. Есть несколько тонких дизайнерских сил, которые должны учитывать разработчики. В целом, различные реализации, которые мы рассмотрели, различаются в зависимости от их правильности, эффективности, справедливости и переносимости. Ни одно решение не обеспечивает все эти качества оптимально.
SignalObjectsAndWait
Решение в разделе 3.4 является хорошим подходом, если справедливость имеет первостепенное значение. Однако этот подход не так эффективен, как другие решения, и при этом он не является переносимым. Поэтому, если эффективность или мобильность важнее справедливости,SetEvent
подход, описанный в разделе 3.2, может быть более подходящим. Естественно, самым простым решением для Microsoft было бы просто предоставить условные переменные в Win32 API.
Обратите внимание, что начиная с Vista, Windows поддерживает условные переменные с использованием собственных API: