Update 3:
После понимания того, что «порядок памяти», я знаю, что проблема полностью не связана с компилятором.
И да, потому что моя архитектура процессора - это Intel x86, независимо от того, какой код я пишу, эффект порядка памяти никогда не произойдет.C++ 11, как соблюдать порядок памяти в атомном :: магазина и атомные :: нагрузки
Обновление 2:
Я проверяю код разборки. Тем не менее, я не знаю, как добавить код, x.store всегда до y.store.
Проблема должна исходить от компилятора (который не меняет порядок кода) вместо CPU (насколько я думаю).
Update:
После того как я прочитал комментарии, мне кажется, что я должен брать машину, которая'S CPU альфа, рука или РРС.
Кто-нибудь знает, где я могу использовать этот вид машины, даже это не бесплатно?
Происхождение:
Я тестирую приведенный ниже код.
atomic<int> x(0);
atomic<int> y(0);
void thr1()
{
x.store(1,memory_order_relaxed);
y.store(1,memory_order_relaxed);
}
void thr2()
{
while(!y.load(memory_order_relaxed))
;
cout<<x.load(memory_order_relaxed)<<endl; //may 0 or 1
}
Я знаю, что выход может быть 0.
Однако, независимо от того, сколько раз я пытался, я всегда получаю 1.
Является ли это из-за моего процессора является x86 архитектуры?
Если нет, как устранить эту проблему?
(BTW, я знаю CppMem. Но он не может использовать цикл.)
Возможно, попробуйте http://www.1024cores.net/home/relacy-race-detector/rrd-introduction? –
Если у вас нет оборудования с достаточно расслабленным заказом, вы не сможете это увидеть. Можете ли вы запустить это на DEC Alpha или Playstation? –
Я не уверен, что это может иметь какое-то значение, но кажется вероятным, что оба номера тесно связаны друг с другом в памяти, весьма вероятно, на одной странице. Возможно, вы увидите разные результаты, если поместите их на разные страницы. – 5gon12eder