Читать переменную в другом потоке
Я использую Linux, и у меня есть две переменные, которые для чтения / записи в другом потоке. Время от времени (100 мс) ThreadB читает состояние переменных и что-то делает. Это в основном while(1){ dosomething(); usleep(); }
, Я беспокоюсь, что переменные будут кэшироваться и никогда не обновляться.
Каков наилучший способ обеспечить работоспособность цикла после оптимизации? я думаю volatile
должен делать работу, но я слышал, что иногда это не работает. Оба цикла запускаются не часто (10 мс +). Какой самый простой и простой способ получить к ним доступ? Я использую C++11
Я немного не уверен, как использовать std::atomic<int>
, Могу ли я просто использовать его как обычную переменную типа int, и он будет работать как положено?
1 ответ
Вы действительно можете просто объявить это как std::atomic<int>
и все должно работать как хочешь.
volatile
о сохранении последовательности адресов и значений, которые сгенерированный код должен представить процессору для чтения / записи. Это вовсе не ограничивает то, что аппаратное обеспечение делает с этим для обеспечения согласованности памяти, что является задачей atomic
, Вот статья от Intel, объясняющая эту разницу.
Стандарты C и C++ (начиная с 2011 года) определяют модель памяти, которая описывает, какие операции определены или не определены в соответствии с языком, и какие значения может дать выражение, если программа в целом четко определена.
Согласно стандартам, любая программа выполняет несинхронизированный доступ несколькими потоками к одному объекту (например, к вашему общему ресурсу). int
), в котором по крайней мере один раз доступ является записью, не определено. Объявление переменной volatile
не делает доступ к нему синхронизированным. Доступ к переменным, объявленным как atomic
всегда синхронизированы по определению.
В случае по умолчанию, если вы просто используете atomic<int>
не изменяя ничего о том, как вы его используете, вы получите так называемые последовательные согласованные обращения, которые наиболее сильно скоординированы между потоками и, следовательно, потенциально наиболее затратны. Для вашего случая использования это не является проблемой - стоимость составляет порядка наносекунд или микросекунд, а вы опрашиваете в миллисекундах. Если вам нужно оптимизировать дальше, вы можете указать менее ограниченный доступ.