Простое использование std :: atomi c для обмена данными между двумя потоками - PullRequest
0 голосов
/ 27 мая 2020

У меня есть два потока, которые имеют общую переменную.

Структура кода в основном такая (очень упрощенный псевдокод):

static volatile bool commondata;

void Thread1()
{
   ...
   commondata = true;
   ...
}

void Thread2()
{
   ...
   while (!commondata)
   {
      ...
   }
   ...
}

Оба потока выполняются, и в какой-то момент Thread1 устанавливает commondata в true. Затем while l oop в Thread2 должно остановиться. Здесь важно то, что Thread2 «видит» изменение, внесенное Thread1 в общие данные.

Я знаю, что наивный метод, использующий изменчивую переменную, неверен и не гарантирует, что он будет работать на каждой платформе.

Достаточно ли хорошо заменить volatile bool commondata на std::atomic<bool> commondata?

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Простой ответ: да! :)

Все операции на атомике свободны от гонки данных и по умолчанию последовательно согласованы.

0 голосов
/ 27 мая 2020

Здесь есть хороший нюанс. Хотя обычно «да», std::atomic само по себе не создает переменную volatile. Это означает, что если компилятор может (каким-то непостижимым образом) сделать вывод, что переменная не изменилась, ему разрешено не перечитывать ее, поскольку он может предположить, что чтение не имеет побочных эффектов.

Если вы отметите , существуют перегрузки как для энергозависимой, так и для энергонезависимой версий класса: http://eel.is/c++draft/atomics.types.generic

Это может стать важным, если, например, переменная atomi c находится в общей памяти.

...