2014-12-06 16 views
11

x86 mimarisinde, aynı bellek konumuna kaydedilen toplam sipariş sayısı vardır, örneğin bkz. this video. C++ 11 bellek modelindeki garantiler nelerdir?Farklı ipliklerdeki aynı konuma iki rahat yazma, her zaman diğer parçacıklarla aynı sırada görülebilir mi?

-- Initially -- 
std::atomic<int> x{0}; 

-- Thread 1 -- 
x.store(1, std::memory_order_release); 

-- Thread 2 -- 
x.store(2, std::memory_order_release); 

-- Thread 3 -- 
int r1 = x.load(std::memory_order_acquire); 
int r2 = x.load(std::memory_order_acquire); 

-- Thread 4 -- 
int r3 = x.load(std::memory_order_acquire); 
int r4 = x.load(std::memory_order_acquire); 

Daha doğrusu

, sonuç (x86 dışındaki bazı mimarisine) izin verilecek r1==1, r2==2, r3==2, r4==1 ki? memory_order'lerin tamamını std::memory_order_relaxed değiştirecek olsaydım ne olur?

cevap

7

Hayır, böyle bir sonuca izin verilmez. §1.10 [intro.multithread]/p8, 18 (alıntı N3936/C++ 14; aynı kısa N3337/C++ 11 paragraflarda 6'da bulunan ve 16): bir ile

8 tüm modifikasyonlar özellikle atom nesne M M M'nin bir değeri hesaplama B önce olur ve bir atomik nesnenin bir değeri hesaplaması A alırsa bazı özellikle toplam amacıyla, modifikasyon sırası M.

arasında

18 olarak adlandırılan meydana onun M üzerinde bir yan etki X değeri, daha sonra B tarafından hesaplanan değer ya da X tarafından depolanan değer veya Y üzerinde bir Y yan etkisi Y tarafından depolanan değer, Y foll 'da X, X'in değişiklik sırasını gösterir. Bu şart okuma-okuma tutarlılığı olarak bilinir. - sonu notu] Kodunuzda

orada iki yan etkileri vardır ve p8 tarafından bazı belli toplam sırada yapılır. Konu 3, değer hesaplama çok r1 == 1 ve r2 == 2 biz den 1 tarafından gerçekleştirilen mağaza x modifikasyonu için Konu 2 tarafından gerçekleştirilen deposu öncesinde biliyoruz verilen r2 arasında daha önce r1 depolanacak değeri olur hesaplamak için kullanılır. Durum böyle olduğunda, Thread 4, p18 ahar olmadan r3 == 2, r4 == 1'u gözlemleyemez. Bu, kullanılan memory_order ne olursa olsun.

ilgilidir (N3337 içinde P19) p21 bir not vardır

:

[Not: yukarıda belirtilen dört tutarlılık şartlar atom işlemlerin etkin bir şekilde disallow derleyici yeniden sıralama tek bir nesne için, bile Her iki işlem de rahat yüklerse. Bu, C++ atomik işlemlerinde kullanılabilen çoğu donanım tarafından sağlanan önbellek tutarlılık garantisini etkili bir şekilde yapar. - uç not] Ortalama

+0

P18'i anlamama yardımcı olabilir misiniz? 'Değer hesaplaması', atomdan yük-atomik ve“ yan etki ”ile eşanlamlı mıdır? –

+0

@ TobiasBrüll Yük bir değer hesaplamasıdır; mağaza bir yan etkidir. –

+0

Başka ne tür değer hesaplamaları var? Ve başka ne tür yan etkiler? –

4

C++ 11 [intro.multithread]/6: ", belirli bir atom nesne M yapılan tüm değişiklikler, bazı özel toplam sırayla meydana M modifikasyonu sırası olarak adlandırılan" Sonuç olarak, bir atomik nesnenin belirli bir iş parçacığı tarafından okunması, iş parçacığının gözlemlediği değerlerden "eski" değerleri asla görmeyecektir. Burada hafıza düzenlerinden bahsedilmediğine dikkat edin, bu nedenle bu özellik, hepsi için geçerli - seq_cst - relaxed.

OP verilen örnekte, x modifikasyonu sırası (0,1,2) veya (0,2,1) olabilir. Bu değişiklik sırasındaki belirli bir değeri gözlemleyen bir iş parçacığı daha sonra daha önceki bir değeri gözlemleyemez. Sonuç r1==1, r2==2, x değişiklik sırasının (0,1,2) olduğunu, ancak r3==2, r4==1, bir çelişki olduğunu, (0,2,1) olduğunu ima eder. Böylece C++ 11'e uygun bir uygulamada sonuç elde edilemez.