SORU
8 AĞUSTOS 2014, Cuma


Anlayış std::atom::compare_exchange_weak() C 11

bool compare_exchange_weak (T& expected, T val, ..);

compare_exchange_weak() karşılaştır-döviz ilkel C 11 sağlanacak.zayıfeğer nesne değeri expected eşit değilse bile false değerini döndürür anlamda. Bu kaynaklanmaktadırsahte yetmezliğitalimatları (x 86 gibi bir yerine) bir dizi uygulamak için kullanılan bazı platformlarda. Bu tür platformlarda, içerik anahtarı, aynı adres (veya önbellek satır) başka bir iş parçacığı tarafından yeniden, vb ilkel başarısız olabilir. Operasyon başarısız olan nesne () expected eşit değer değil gibi spurious. Bunun yerine, zamanlama sorunları gibi.

Ama C 11 Standart (ISO/IEC 14882) demişti bana, ne bulmaca

29.6.5 .. Sahte yetmezliği sonucu zayıf neredeyse tüm kullanmasıdır karşılaştırma ve değişim bir döngü içinde olacak.

Neden bir döngü içinde olmak zorunda mıneredeyse tümünü kullanır? Sahte hataları nedeniyle başarısız olduğunda bunu yapacağız demek döngü? Eğer durum buysa, neden compare_exchange_weak() kullanımı ve döngü yazmak rahatsız kendimizi muyuz? Sadece sahte hataları kurtulmak gerektiğini düşünüyorum compare_exchange_strong() bizim için kullanabiliriz. Ortak compare_exchange_weak() durumlarında kullanmak nedir?

İlgili bir diğer soru. Kitabında "C Eşzamanlılık" Anthony diyor . Eylem

//Because compare_exchange_weak() can fail spuriously, it must typically
//be used in a loop:

bool expected=false;
extern atomic<bool> b; // set somewhere else
while(!b.compare_exchange_weak(expected,true) && !expected);

//In this case, you keep looping as long as expected is still false,
//indicating that the compare_exchange_weak() call failed spuriously.

Neden !expected döngü koşulu var mı? Tüm konuları aç ve bir süre hiçbir ilerleme yapabilir bunu önlemek için var mı?

Edit: (Son soru)

Tek bir donanım CAS talimat var olan platformlarda, hem de zayıf ve güçlü versiyonu LL/SC (KOL, Power PC, vb) kullanılarak uygulanır. Yani aşağıdaki iki döngüler arasında bir fark var mı? Varsa neden? (Bana, benzer bir performans olmalı.)

// use LL/SC (or CAS on x86) and ignore/loop on spurious failures
while (!compare_exchange_weak(..))
{ .. }

// use LL/SC (or CAS on x86) and ignore/loop on spurious failures
while (!compare_exchange_strong(..)) 
{ .. }

Yukarı w/ bu Son soru siz orada belki bir performans döngü içinde fark söz gelirim. Ayrıca C 11 Standart (ISO/IEC 14882) tarafından belirtildiği gibi:

Bir karşılaştırma ve değişim bir döngü içinde olduğunda, zayıf sürümünü verecektir bazı platformlarda daha iyi performans.

Ama yukarıda incelediğimiz gibi, bir döngü içinde iki sürümleri aynı/benzer performans verecektir. Özlediğim şey ne?

CEVAP
8 AĞUSTOS 2014, Cuma


Neden bir döngü Kur yapıyor?

Genellikle, istediğiniz iş için önce yapılması taşımak, böylece koymak compare_exchange_weak içine bir döngü böylece çalışır exchange kadar başarılı (yani, döner true).

Ayrıca compare_exchange_strong genellikle bir döngü içinde kullanıldığını unutmayın. Sahte hatası nedeniyle başarısız değil, ama nedeniyle eşzamanlı yazma başarısız.

Neden strong yerine weak kullanmak için?

Oldukça kolay: Sahte hatası büyük performans hit çok sık olan bir şey değil. İçinde karşıtlık, tolere etmek gibi bir hata verir için çok daha etkili bir şekilde uygulanması weak sürüm (karşılaştırma için strong) bazı platformlar: strong mutlaka her zaman kontrol etmek için sahte yetmezliği ve maske. Bu pahalı.

Böylece, weak bazı platformlarda bir sürü strong daha hızlı olduğu için kullanılır

strong weak ve kullanmak gerekir?

reference Devletleri weak kullanma ve strong kullanma ipuçları:

Bir karşılaştırma ve değişim bir döngü içinde olduğunda, zayıf sürümünü verecektir bazı platformlarda daha iyi performans. Zayıf bir karşılaştırma ve değişim zaman bir döngü ve güçlü değil, güçlü bir gerektirecektir tercih edilebilir.

Bir döngüde sadece sahte yetmezliği nedeniyle olurdu, bunu yapma; strong kullanın. cevabı hatırlamak oldukça basit gibi görünüyor: Eğer bir döngü zaten varsa, o zaman weak kullanın.

Neden örnekte !expected

Durum ve istediğiniz anlambilimi bağlıdır, ama genellikle doğruluğu için gerekli değildir. O atlama çok benzer bir semantik verim. Sadece başka bir iş parçacığı false, değerini sıfırlayabilir bir durumda mantığı biraz farklı (henüz veremem isterdin anlamlı bir örnek) olabilir. D. Tony ayrıntılı bir açıklama için bkz: açıklama.

Sadece hızlı bir parçabaşka birtrue tekrar yazmaya çalışmak yerine iptal ediyoruz. iplik true yazıyor:

Son soru hakkında

Ama yukarıda incelediğimiz gibi, bir döngü içinde iki sürümleri aynı/benzer performans verecektir. Özlediğim şey ne?

Wikipedia:

LL/SC gerçek uygulamalar her zaman eğer eğer orada başarısız söz konusu bellek konumunu eş zamanlı güncellemeleri. Herhangi bir olağanüstü iki işlem arasındaki olayları, bağlam anahtarı, başka bir gibi yük-link, hatta (birçok platformlarda) başka bir yük veya mağaza operasyon, spuriously mağaza-koşullu başarısız olmasına neden olur. Eski uygulamaları eğer herhangi bir güncelleme üzerinde yayın ise orada başarısız olur bellek yolu.

Yani, LL/SC içerik anahtarı üzerinde spuriously, örneğin başarısız olur. Şimdi, güçlü versiyonu onun" sahte arıza tespit ve tekrar. deneyerek maske "kendi küçük döngü getirecek Not: bu kendi döngü de daha karmaşık bir normal CAS döngü, bu yana gerek ayırt sahte yetmezliği ve maske) ve başarısızlık nedeniyle eş zamanlı erişim (hangi sonuçları bir dönüş değeri false). Zayıf versiyonu gibi kendi döngü yok.

Her iki örnekte de açık bir döngü sağlamak olduğundan, sadece gerekli güçlü sürümü için küçük bir döngü değildir. Sonuç olarak, örnek olan strong sürüm kontrol hatası yapmış iki kez; bir kez compare_exchange_strong daha karmaşık beri gerek ayırt sahte yetmezliği ve eş zamanlı saat) ve bir döngü. Bu pahalı bir onay gerekli değildir weak neden daha hızlı gelecek.

Ayrıca bağımsız değişken (LL/SC) olduğunu unutmayınbirolasılık bunu uygulamak için. Hatta farklı komut setleri daha platformlar vardır. Ayrıca (ve daha önemlisi), std::atomic tüm işlemler için desteklemesi gerekirolası tüm veri türlerieğer on milyon bayt bir yapı bildirirseniz , bu compare_exchange kullanabilirsiniz. Hatta ne zaman bir CPU mu var CAS, olamaz CAS on milyon bayt, yani derleyici oluşturur diğer talimatları (muhtemelen kilitle, ardından bir sigara-atom karşılaştırın ve takas, ardından kilidi). Şimdi, birçok şey on milyon bayt değiştirme sırasında ne kadar çabuk olabileceğini düşünüyorum. Yani sahte bir hata 8 bayt alışverişi için çok nadir olsa da, bu durumda daha fazla ortak olabilir.

Yani işin özeti, C verir iki anlambilim, bir "en iyi çaba" (weak) ve "yaparım tabii, ne kadar çok kötü şeyler olabileceğini arasındakileri" (strong). Bu farklı veri türleri üzerinde nasıl uygulandığını ve platformları tamamen farklı bir konudur. Özel platform üzerinde uygulanması için zihinsel model kravat yok; standart kütüphane sizin bildiğiniz daha mimarileri ile çalışmak üzere tasarlanmıştır. Varabileceğimiz tek sonuç genel başarı garanti sadece çalışıyor ve olası hata için oda bırakarak daha genellikle daha zor (ve böylece ek iş gerektirebilir).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • iBand IguJoo

    iBand IguJoo

    25 AĞUSTOS 2006