Как показано в этом ответе, который я недавно опубликовал, я, похоже, запутался в утилите (или ее отсутствии) volatile
в многопоточных контекстах программирования.
Мое понимание таково: в любое время, когда переменная может быть изменена вне потока управления частью кода, доступ к ней, эта переменная должна быть объявлена как volatile
. Подобные ситуации составляют обработчики сигналов, регистры ввода/вывода и переменные, измененные другим потоком.
Итак, если у вас есть глобальный int foo
, а foo
считывается одним потоком и атомизируется другим потоком (возможно, с использованием соответствующей машинной команды), поток чтения воспринимает эту ситуацию так же, как и видит переменную, обработанную обработчиком сигнала или модифицированную внешним аппаратным условием, и, таким образом, foo
должен быть объявлен volatile
(или для многопоточных ситуаций, к которому обращаются с нагрузкой с памятью, что, вероятно, является лучшим решением).
Как и где я ошибаюсь?