Каковы примеры барьеров памяти в С++?

Я вижу, что блокировка мьютексов С++ 11 не void lock() volatile. Как компилятор знает, какие функции являются барьерами памяти, а какие нет? Все ли функции барьеров, даже если они нестабильны? Каковы некоторые менее известные барьеры памяти и барьеры памяти, которые должны знать все?

Ответ 1

Библиотека времени выполнения должна реализовать мьютекс таким образом, чтобы компилятор знал! В стандарте языка ничего не говорится о том, как это сделать.

Вероятно, это связано с вызовом какой-либо службы операционной системы, которая работает как барьер памяти. Или компилятор может иметь расширение, например void _ReadWriteBarrier();

Ответ 2

Фактическая реализация вашего std::mutex будет такова, что компилятор не выполняет незаконное переупорядочение, не справляется с переменными нагрузками и гарантирует, что переменная блокировки получает доступ атомарно и что CPU выполняет необходимую память барьеры для фиксации и снятия блокировки.

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