2016-12-19 2 views
0

Когда я искал, как я могу использовать семафоры в C++ 11, я видел, как люди часто предлагают сделать один из std::mutex и std::condition_variable (например, this post). Это заставило меня думать, что семафоры представляют собой абстракцию более высокого уровня, чем мьютексы и переменные условия.Семафоры против переменных условий - уровень абстракции

Однако после того, как я взял наш класс операционной системы, теперь я знаю, что в ядре семафоры обычно являются самым низким уровнем абстракции. Семафоры реализуются путем отключения прерываний, а блокировки по существу являются семафорами со значением 1, а переменные условия реализуются с нуля без использования семафоров или блокировок. Таким образом, кажется, что семафоры (на уровне ядра) не являются абстракцией более высокого уровня, чем блокировки или переменные условия.

Итак, мой вопрос в том, что «семафоры (на C++ 11) являются абстракцией более высокого уровня« просто артефактом ограничения стандартной библиотеки? Или это результат различия между синхронизацией уровня пользователя и ядра?

+0

«Это заставило меня думать» - почему? Ни один из них не является более высоким уровнем абстракции. Если что-то есть Mutex - это особый случай семафора, если вы хотите настаивать на отношениях. – kabanus

+0

@kabanus Хорошо, потому что, когда вы что-то строите из чего-то другого, обычно подразумевается, что первая является абстракцией более высокого уровня, чем последняя ...? –

+0

Не обязательно. Обратите внимание, что вы можете построить мьютекс из семафора (установите count = 1) и наоборот, как вы разместили. «Мьютекс» в некотором смысле меньше, но я думаю, что немного сложно определить, что он является более высокой абстракцией, чем другой. Более высокая абстракция для обоих может быть общей «блокировкой», например, определяющей общие правила блокировки, но не гарантирующие реализацию. Выбор реализации мьютекса в C++, а не семафор, на мой взгляд, произволен. Существуют нестандартные библиотеки с семафорами. – kabanus

ответ

2

Это результат различия между синхронизацией уровня пользователя и уровня ядра.

Когда вы указываете в ядре, вы не указываете, к какому ядру вы обращаетесь. Стандартная библиотека должна быть такой же агностической, как и ядро, поэтому выбираем наиболее общий интерфейс. Не все ядра реализуют блокировки точно так же.

Реализация замков в ядре Linux, к примеру, довольно тонкая, чем базовый семафор, инициализированный значением 1. Возможно, вы слышали о futexes.

Наконец, поскольку использование семафоров довольно мало по сравнению с использованием мьютексов, имеет смысл выбрать мьютексы как общий интерфейс для стандартной библиотеки.

Смежные вопросы