Я экспериментирую с поддержкой C ++ 0x, и есть проблема, которую, как мне кажется, быть не должно.Либо я не понимаю тему, либо gcc имеет ошибку.
У меня есть следующий код, изначально x
и y
равны.Поток 1 всегда сначала увеличивает x
, а затем y
.Оба являются целочисленными атомарными значениями, поэтому с приращением проблем нет.Поток 2 проверяет, меньше ли x
, чем y
, и отображает сообщение об ошибке, если так.
Этот код иногда дает сбой, но почему?Проблема здесь, вероятно, заключается в переупорядочении памяти, но все атомарные операции последовательно согласованы по умолчанию, и я явно не ослаблял эти операции.Я компилирую этот код на x86, который, насколько я знаю, не должен иметь проблем с упорядочением.Не могли бы вы объяснить, в чем проблема?
#include <iostream>
#include <atomic>
#include <thread>
std::atomic_int x;
std::atomic_int y;
void f1()
{
while (true)
{
++x;
++y;
}
}
void f2()
{
while (true)
{
if (x < y)
{
std::cout << "error" << std::endl;
}
}
}
int main()
{
x = 0;
y = 0;
std::thread t1(f1);
std::thread t2(f2);
t1.join();
t2.join();
}
Результат можно посмотреть здесь .