Это сложный вопрос, пожалуйста, тщательно подумайте, прежде чем отвечать.
Рассмотрим эту ситуацию. Два потока (читатель и писатель) получают доступ к одному глобальному int
. Это безопасно? Обычно, я бы ответил без мысли, да!
Однако мне кажется, что Герб Саттер так не думает. В своих статьях об эффективном concurrency он обсуждает ошибочную блокировку очереди и исправленная версия.
В конце первой статьи и в начале второго он обсуждает редко рассматриваемый признак переменных, записывает порядок. Int являются атомарными, хорошими, но ints необязательно упорядочены, что может уничтожить любой алгоритм без блокировки, включая мой сценарий выше. Я полностью согласен с тем, что единственный способ гарантировать правильное многопоточное поведение на всех существующих и будущих платформах - использовать атоматику (блокировки памяти AKA) или мьютексы.
Мой вопрос; является ли повторная запись проблемы на реальном оборудовании? Или многопоточная паранойя просто педантична?
Как насчет классических однопроцессорных систем?
Что относительно более простых RISC-процессоров, таких как встроенный power-pc?
Уточнение: меня больше интересует то, что сказал г-н Саттер о записи переменных переупорядочения аппаратного обеспечения (процессор/кеш). Я могу остановить оптимизатор от нарушения кода с помощью переключателей компилятора или ручной проверки сборки после компиляции. Тем не менее, я хотел бы знать, может ли аппаратное обеспечение испортить код на практике.