Estoy experimentando con el soporte de C++ 0x y hay un problema, que supongo que no debería estar allí. O no entiendo el tema o gcc tiene un error.Problemas de ordenación de memoria
Tengo el siguiente código, inicialmente x
y y
son iguales. El hilo 1 siempre incrementa x
primero y luego incrementa y
. Ambos son valores enteros atómicos, por lo que no hay ningún problema con el incremento en absoluto. El hilo 2 está comprobando si el x
es menor que y
y muestra un mensaje de error si es así.
Este código falla a veces, pero ¿por qué? El problema aquí es probablemente el reordenamiento de la memoria, pero todas las operaciones atómicas son consecutivamente consistentes por defecto y no me relajé explícitamente de esas operaciones. Estoy compilando este código en x86, que, por lo que sé, no debería tener problemas con el pedido. ¿Puedes explicar cuál es el problema?
#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();
}
El resultado se puede ver here.
Actualmente esta es una implementación experimental de C++ 0x, por lo que la segunda es posible, pero creo que la primera es más probable: P – confucius
El código publicado arriba siempre producirá '" error "', ('x' siempre será mayor o igual a 'y') ¿es esto lo que querías? – Paul
¿Por qué si (x
confucius