Sto sperimentando con il supporto C++ 0x e c'è un problema, suppongo che non dovrebbe esserci. O non capisco l'argomento o gcc ha un bug.Problemi di ordinamento della memoria
Ho il seguente codice, inizialmente x
e sono uguali. Il thread 1 incrementa sempre x
e quindi incrementa . Entrambi sono valori interi atomici, quindi non vi è alcun problema con l'incremento. Thread 2 sta verificando se il x
è inferiore a e visualizza un messaggio di errore in tal caso.
Talvolta questo codice non riesce, ma perché? Il problema qui è probabilmente il riordino della memoria, ma tutte le operazioni atomiche sono sequenzialmente coerenti per impostazione predefinita e non mi sono esplicitamente rilassato di quelle operazioni. Sto compilando questo codice su x86, che per quanto ne so non dovrebbe avere problemi di ordinamento. Puoi spiegare per favore qual è il 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();
}
Il risultato può essere visualizzato here.
In realtà questa è un'implementazione sperimentale di C++ 0x, quindi il secondo è possibile, ma credo che il primo sia più probabile: P – confucius
Il codice pubblicato sopra produrrà sempre "errore" ', (' x' sarà sempre maggiore o uguale a 'y') è questo che volevi? – Paul
Perché if (x
confucius