Как реализованы условные переменные?

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

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

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

1 ответ

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

Суть (заключительные замечания):

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

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

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

Другие вопросы по тегам