Я вижу, что блокировка мьютексов С++ 11 не void lock() volatile
. Как компилятор знает, какие функции являются барьерами памяти, а какие нет? Все ли функции барьеров, даже если они нестабильны? Каковы некоторые менее известные барьеры памяти и барьеры памяти, которые должны знать все?
Каковы примеры барьеров памяти в С++?
Ответ 1
Библиотека времени выполнения должна реализовать мьютекс таким образом, чтобы компилятор знал! В стандарте языка ничего не говорится о том, как это сделать.
Вероятно, это связано с вызовом какой-либо службы операционной системы, которая работает как барьер памяти. Или компилятор может иметь расширение, например void _ReadWriteBarrier();
Ответ 2
Фактическая реализация вашего std::mutex
будет такова, что компилятор не выполняет незаконное переупорядочение, не справляется с переменными нагрузками и гарантирует, что переменная блокировки получает доступ атомарно и что CPU выполняет необходимую память барьеры для фиксации и снятия блокировки.
Подробные сведения о том, как много работы нужно сделать для обеспечения этого, варьируются от платформы к платформе, но ваша реализация библиотеки будет делать правильную вещь.