Используйте ключевое слово volatile , чтобы указать компилятору, что значение может измениться в любое время.
volatile int myInteger;
Вышеуказанное гарантирует, что любой доступ к переменной будет в и из памяти без какой-либо конкретной оптимизации, и в результате все потоки, работающие на одном и том же процессоре, будут «видеть» изменения в переменной с той же семантикой, что и код, считываемый .
Крис Джестер-Янг отметил, что проблемы согласованности в отношении такого изменения значения переменной могут возникнуть в многопроцессорных системах. Это соображение, и оно зависит от платформы.
На самом деле, есть два соображения, которые следует учитывать относительно платформы. Это согласованность и атомарность транзакций памяти.
Атомность на самом деле учитывается как для однопроцессорных, так и для многопроцессорных платформ. Проблема возникает из-за того, что переменная, вероятно, имеет многобайтовый характер, и вопрос в том, может ли один поток увидеть частичное обновление значения или нет. то есть: некоторые байты изменены, переключение контекста, неверное значение, прочитанное прерыванием потока. Для одной переменной, которая имеет натуральный машинный размер слова или меньше и выровнена естественным образом, это не должно вызывать беспокойства. В частности, тип int всегда должен быть в порядке в этом отношении, пока он выровнен - что должно быть случаем по умолчанию для компилятора.
Относительно когерентности, это потенциальная проблема в многопроцессорной системе. Вопрос в том, реализует ли система полную когерентность кэша или нет между процессорами. В случае реализации это обычно делается с помощью аппаратного протокола MESI. Вопрос не касался платформ, но как платформы Intel x86, так и платформы PowerPC имеют кэш-память, согласованную между процессорами для нормально отображаемых областей данных программы. Поэтому проблема такого типа не должна беспокоить обычный доступ к памяти данных между потоками, даже если имеется несколько процессоров.
Последняя проблема, связанная с атомарностью, связана с атомарностью чтения-изменения-записи. То есть, как вы гарантируете, что если значение читается, обновляется в значении и записывается, что это происходит атомарно, даже между процессорами, если их больше одного. Таким образом, для того, чтобы это работало без определенных объектов синхронизации, потребовалось бы, чтобы все потенциальные потоки, обращающиеся к переменной, были ТОЛЬКО читателями, но ожидали, что только один поток может когда-либо быть записывающим. Если это не так, то вам нужен доступный объект синхронизации, чтобы обеспечить атомарные действия для действий чтения-изменения-записи переменной.