2015-12-05 3 views
7

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. Но он не может использовать цикл.)

+0

Возможно, попробуйте http://www.1024cores.net/home/relacy-race-detector/rrd-introduction? –

+0

Если у вас нет оборудования с достаточно расслабленным заказом, вы не сможете это увидеть. Можете ли вы запустить это на DEC Alpha или Playstation? –

+0

Я не уверен, что это может иметь какое-то значение, но кажется вероятным, что оба номера тесно связаны друг с другом в памяти, весьма вероятно, на одной странице. Возможно, вы увидите разные результаты, если поместите их на разные страницы. – 5gon12eder

ответ

3

То, что вы испытываете, не является «проблемой». По крайней мере, не в том, что касается стандарта.

Когда заказ расслаблен, это означает, что заказ больше не гарантируется. Это не означает, что реализации должны поместить их в разные заказы.

Другой компилятор может показать это; то опять же это может и не быть. Черт, просто изменение оптимизации может привести к ее возникновению. Опять же, может и нет. В конечном счете вы ничего не можете сделать с гарантией, видя другой порядок (вне эмуляции какого-то рода или аналогичных инструментов). Просто потому, что вы заявляете, что что-то может быть быть возможным, не гарантирует, что это произойдет или должно произойти.

+0

Насколько я понимаю, упорядочение памяти, _compiler_ разрешено изменять порядок в предметных магазинах, если он по какой-то причине решил лучше. В этом случае можно было бы наблюдать эту «слабость» даже на x86. Но я не могу поймать это с помощью GCC и Clang. Они переупорядочивают неатомные магазины или даже загружают их с помощью SIMD. Но как только я делаю переменные атомными, магазины становятся регулярными ходами по порядку. –

+0

@ConstantinBaranov: Есть два вопроса: может ли компилятор поместить инструкции в другом порядке и будет ли * аппаратное обеспечение * выполнять их в указанном порядке. Если компилятор не видит необходимости размещать их в другом порядке, то это не будет. Кроме того, только потому, что инструкции приходят в другом порядке, это не значит, что вы можете видеть это без эмуляции или другой глубокой отладки. –

Смежные вопросы