Я читаю, что ключевое слово volatile
не подходит для синхронизации потоков, и на самом деле оно не требуется для этих целей вообще.
Хотя я понимаю, что использование этого ключевого слова недостаточно, я не понимаю, почему это совершенно не нужно.
Например, предположим, что у нас есть два потока, поток A, который читает только из общей переменной и потока B, который только записывает в общую переменную. Правильная синхронизация, например. mutexs pthreads принудительно.
IIUC, без ключевого слова volatile, компилятор может посмотреть код потока A и сказать: "Здесь переменная не изменяется, но мы имеем много чтений, давайте ее читаем только один раз, кешируем значение и оптимизируйте все последующие чтения". Также он может посмотреть код потока B и сказать: "У нас здесь много записей этой переменной, но не читается, поэтому письменные значения не нужны и, следовательно, позволяют оптимизировать все записи".
Обе оптимизации были бы неверными. И как один будет предотвращен изменчивостью. Поэтому я бы, скорее всего, пришел к выводу, что пока volatile
недостаточно для синхронизации потоков, все равно необходимо, чтобы любая переменная была разделена между потоками. (примечание: теперь я читаю, что на самом деле для volatile
не требуется, чтобы предотвратить ошибки написания, поэтому я не в курсе, как предотвратить такую неправильную оптимизацию)
Я понимаю, что я здесь неправ. Но почему?