2012-09-09 13 views
17

Mağazalar, serbest bırakma işlemleridir ve yükler her ikisi için de işlem gerçekleştirir. Ben memory_order_seq_cst tüm işlemler için ek bir toplam sipariş empoze etmek amaçlı olduğunu biliyorum, ama hepsi memory_order_seq_cstmemory_order_acq_rel tarafından değiştirilmesi halinde durum böyle değil bir örnek oluşturmaya başaramıyorum.memory_order_seq_cst ve memory_order_acq_rel nasıl farklılıklar gösterir?

Bir şeyi özlüyor muyum, ya da fark sadece bir dokümantasyon etkisidir, yani biri daha rahat bir modelle oynamak istemiyorsa ve memory_order_acq_rel rahat modelini kısıtlarken memory_order_seq_cst kullanmalıdır?

cevap

18

http://en.cppreference.com/w/cpp/atomic/memory_order sadece memory_order_seq_cst ile çalışır altındaki iyi bir örnek vardır. Temel olarak memory_order_acq_rel, atomik değişkene göre okuma ve yazma emirleri sağlarken, memory_order_seq_cst genel olarak okuma ve yazma emri sağlar. Yani, sıralı olarak tutarlı işlemler tüm iş parçacıklarında aynı sırada görülebilir.

örnek bu kadar aşağı kaynar: Eğer z hep artırılır zorunlu kılmak amacıyla acquire salınımlı anlambilim kullanamaması için z üzerinde

bool x= false; 
bool y= false; 
int z= 0; 

a() { x= true; } 
b() { y= true; } 
c() { while (!x); if (y) z++; } 
d() { while (!y); if (x) z++; } 

// kick off a, b, c, d, join all threads 
assert(z!=0); 

Operasyonlar, iki atom değişkenler değil, birer korunuyor.

+0

Neden "x = true; y = true; c(); d()' anlamıyorum? Bunun 0 olmasına neden olması gerekiyor. Ayrıca sonuç olarak neden çok fazla 2 aldığımı bilmiyorum. –

+1

@ acidzombie24, bu durumda bile, 'z' 2 olacak. – MSN

+0

Ben berbat ettim, kodu yanlış okuyorum. Bu mükemmel bir anlam ifade ediyor –

İlgili konular