При использовании atomic
.
у вас есть 2 ошибки. При сбое compare_exchange_weak текущее значение сохраняется в первом параметре. Если вы хотите продолжать пробовать одно и то же значение, вам нужно установить его обратно в исходное значение:
while ((turn.compare_exchange_weak(f, false)) == false)
{
f = true;
}
Вторая проблема заключается в том, что exchange
возвращает текущее сохраненное значение так:
turn = turn.exchange(true);
Устанавливает значение поворота обратно в false, вам нужно просто:
turn.exchange(true);
Или даже просто:
turn = true;
В этом случае синхронизация на самом деле не нужна, так как std::cout
выполнит синхронизацию за вас, отдельные операции вывода не будут перекрываться, так что вы можете просто изменить свою print
функцию на следующую, и она будет просто работать:
void print(int i)
{
for (int j = 0; j < 100; j++)
{
cout << std::to_string(i) + "\n";
}
}
Атомика не правильный подход к этому проблема, ваш код невероятно медленный Мьютексы, вероятно, будут быстрее.