Читать переменную в другом потоке

Я использую 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> не изменяя ничего о том, как вы его используете, вы получите так называемые последовательные согласованные обращения, которые наиболее сильно скоординированы между потоками и, следовательно, потенциально наиболее затратны. Для вашего случая использования это не является проблемой - стоимость составляет порядка наносекунд или микросекунд, а вы опрашиваете в миллисекундах. Если вам нужно оптимизировать дальше, вы можете указать менее ограниченный доступ.

Другие вопросы по тегам