“Daha önce güçlü bir şekilde gerçekleşir” ne anlama geliyor?


10

"Daha önce kesinlikle olur" ifadesi C ++ taslak standardında birkaç kez kullanılır.

Örneğin: Fesih [basic.start.term] / 5

Stad saklama süresi olan bir nesnenin başlatılmasının tamamlanması, std :: atexit çağrısından önce gerçekleşirse (bkz., [Support.start.term]), std :: atexit işlevine yapılan çağrı nesnenin yıkıcısına yapılan çağrıdan önce sıralanır. Stad depolama süresine sahip bir nesnenin başlatılması tamamlanmadan önce std :: atexit çağrısı güçlü bir şekilde gerçekleşirse, std :: atexit işlevine iletilen işlevin çağrılmasından önce nesne için yıkıcıya çağrı sıralanır. . Std :: atexit çağrısı güçlü bir şekilde başka bir std :: atexit çağrısından önce gerçekleşirse, ikinci std :: atexit çağrısına iletilen işleve çağrı, işleve çağrıdan önce sıralanır. ilk std :: atexit çağrısı.

Ve Veri yarışlarında tanımlanmıştır [intro.races] / 12

Değerlendirme A, değerlendirme D'den önce,

(12.1) A, D'den önce dizilir veya

(12.2) A, D ile senkronize olur ve A ve D'nin her ikisi de sırayla tutarlı olan atomik işlemlerdir ([atomik düzen]) veya

(12.3) A ve B'den önce dizilenecek şekilde B ve C değerlendirmeleri vardır, B basitçe C'den önce olur ve C, D'den önce dizilir veya

(12.4) bir değerlendirme B vardır, öyle ki A güçlü bir şekilde B'den önce ve B güçlü bir şekilde D'den önce olur.

[Not: Gayri resmi olarak, A B'den önce güçlü bir şekilde gerçekleşirse, A tüm bağlamlarda B'den önce değerlendirilmiş gibi görünür. Hariç tutma işlemleri hariç tutulmadan önce kesinlikle olur. - son not]

"Daha önce güçlü bir şekilde gerçekleşir" neden tanıtıldı? Sezgisel olarak, "daha önce olur" ile farkı ve ilişkisi nedir?

Nottaki "A, tüm bağlamlarda B'den önce değerlendirilmiş gibi görünüyor" ne anlama geliyor?

(Not: Bu soru için motivasyon Peter Cordes'in bu cevap altındaki yorumlarıdır .)

Ek taslak standart teklif (Peter Cordes sayesinde)

Düzen ve tutarlılık [atom. Sipariş ] / 4

Çitler de dahil olmak üzere tüm memory_order :: seq_cst işlemlerinde aşağıdaki kısıtlamaları karşılayan tek bir toplam S sırası vardır. İlk olarak, A ve B memory_order :: seq_cst işlemleri ve A, B'den önce güçlü bir şekilde gerçekleşiyorsa, A, S'de B'den önce gelir. B'den önce, aşağıdaki dört koşulun S tarafından karşılanması gerekir:

(4.1) A ve B'nin ikisi de memory_order :: seq_cst işlemi ise, A, S'de B'den önce gelir; ve

(4.2) A bir memory_order :: seq_cst işlemiyse ve B bir memory_order :: seq_cst çit Y'den önce olursa, A S'de Y'den önce gelir; ve

(4.3) bir memory_order :: seq_cst çit X, A'dan önce gerçekleşir ve B bir memory_order :: seq_cst işlemi ise, X, S'de B'den önce gelir; ve

(4.4) bir memory_order :: seq_cst çit X A'dan önce ve B bir memory_order :: seq_cst çit Y'den önce olursa, X, S'de Y'den önce gelir.


1
Mevcut taslak standardı da referanslar için başvuran bir kural için bir koşul olarak "Güçlü şekilde B önce olur" seq_cstin, : Atomics 31,4 Sipariş ve tutarlılık 4 . Bu C ++ 17 n4659 standardında değildir, burada 32.4 - 3, etkilenen tüm konumlar için "önce gerçekleşir" siparişi ve değişiklik siparişleriyle tutarlı bir tek toplam seq_cst ops varlığını tanımlar ; "kuvvetli" bir sonraki taslağa eklendi.
Peter Cordes

2
@PeterCordes Bence tüketmeyi dışlayan, HB'nin “her bağlamda” / “güçlü” olduğunu belirten ve fonksiyon göstericilerine yapılan çağrılardan bahsetmek ölü bir hediyedir. Çok iş parçacıklı bir program bir iş atexit()parçacığında ve exit()başka bir iş parçacığında çağırıyorsa , başlatıcıların yalnızca tüketime dayalı bir bağımlılık taşıması yeterli değildir, çünkü sonuçlar exit()aynı iş parçacığı tarafından çağrılmışsa farklıdır . Eski bir cevabım bu farkla ilgiliydi.
Iwillnotexist Idonotexist


@IwillnotexistIdonotexist Bir MT programından bile çıkabilir misiniz? Temelde kırık bir fikir değil mi?
curiousguy

1
@curiousguy Amacı bu exit(). Herhangi bir iş parçacığı programdan çıkarak tüm programı öldürebilir veya ana iş parçacığı return-ing ile çıkabilir . Bu, atexit()işleyicilerin çağrılması ve ne yaparlarsa yapsın tüm iş parçacıklarının ölümüyle sonuçlanır.
Iwillnotexist Idonotexist

Yanıtlar:


5

"Daha önce güçlü bir şekilde gerçekleşir" neden tanıtıldı? Sezgisel olarak, "daha önce olur" ile farkı ve ilişkisi nedir?

"Daha önce olur" için de kendinizi destekleyin! Şu anki cppref anlık görüntüsüne bir göz atın https://en.cppreference.com/w/cpp/atomic/memory_order

resim açıklamasını buraya girin

C ++ 20'de "daha önce olur" eklendi gibi görünüyor.

Daha önce olur

İş parçacıklarından bağımsız olarak, A değerlendirme aşağıdakilerden herhangi biri doğruysa B değerlendirmesinden önce olur:

1) A, B'den önce sıralanır

2) A, B ile senkronize olur

3) Sadece X'ten önce olur ve X B'den önce olur

Not: tüketme işlemleri olmadan, ilişkiler önce ve önce olur aynıdır.

Yani Simply-HB ve HB, tüketme işlemlerini nasıl ele aldıkları dışında aynıdır. HB'ye bakınız

Olur-öncesi

İpliklerden bağımsız olarak, aşağıdakilerden herhangi biri doğruysa değerlendirme A değerlendirme B'den önce olur:

1) A, B'den önce sıralanır

2) Bir iç diş B'den önce gerçekleşir

Uygulama, gerektiğinde ek senkronizasyon getirerek önce gerçekleşen ilişkinin döngüsel olmamasını sağlamak için gereklidir (yalnızca bir tüketme işlemi söz konusu olduğunda gerekli olabilir, bkz. Batty ve ark.)

Tüketim açısından nasıl farklılar? Bakınız Inter-Thread-HB

İlişkiler arası daha önce olur

İş parçacıkları arasında değerlendirme Aşağıdakilerden herhangi biri doğruysa, B değerlendirmesinden önce bir iş parçacığı gerçekleşir

1) A, B ile senkronize olur

2) A, B'den önce bağımlılık siparişidir

3) ...

...

Bağımlılık gerektiren bir işlem (yani serbest bırakma / tüketme kullanan) HB'dir, ancak zorunlu olarak Simply-HB değildir.

Tüketim elde etmekten daha rahattır, bu yüzden doğru anlarsam HB, Simply-HB'den daha rahattır.

Kesinlikle daha önce olur

İpliklerden bağımsız olarak, değerlendirme Aşağıdakilerden herhangi biri doğruysa, değerlendirme B'den önce kuvvetle gerçekleşir:

1) A, B'den önce sıralanır

2) A, B ile senkronize olur ve A ve B'nin her ikisi de ardışık olarak tutarlı atomik işlemlerdir

3) A, X'ten önce sıralanır, X, Y'den önce olur ve Y, B'den önce sıralanır

4) X'ten önce güçlü bir şekilde ve X B'den önce güçlü bir şekilde gerçekleşir

Not: gayri resmi olarak, A B'den önce güçlü bir şekilde gerçekleşirse, A tüm bağlamlarda B'den önce değerlendirilmiş gibi görünür.

Not: tüketme işlemlerini hariç tutmadan önce kesinlikle olur.

Dolayısıyla, bir serbest bırakma / tüketme işlemi Güçlü-HB olamaz.

Serbest bırakma / edinme HB ve Simply-HB olabilir (çünkü serbest bırakma / edinme senkronize olur), ancak mutlaka Güçlü HB değildir. Çünkü Strongly-HB özellikle A'nın B VE ile senkronize edilmesi gerektiğini ve Sıralı Olarak Tutarlı bir işlem olduğunu söylüyor.

                            Is happens-before guaranteed?

                        HB             Simply-HB          Strongly-HB

relaxed                 no                 no                 no
release/consume        yes                 no                 no      
release/acquire        yes                yes                 no
S.C.                   yes                yes                yes

Nottaki "A, tüm bağlamlarda B'den önce değerlendirilmiş gibi görünüyor" ne anlama geliyor?

Tüm bağlamlar: Tüm iş parçacıkları / tüm CPU'lar aynı sırayı görür (veya "sonunda anlaşacaktır"). Bu, sıralı tutarlılığın garantisidir - tüm değişkenlerin küresel toplam modifikasyon sırası. Edinme / bırakma zincirleri yalnızca zincire katılan dişliler için algılanan değişiklik sırasını garanti eder. Zincir dışındaki ipliklerin teorik olarak farklı bir düzen görmesine izin verilir.

Strongly-HB ve Simply-HB'nin neden tanıtıldığını bilmiyorum. Tüketim etrafında nasıl çalışacağını açıklığa kavuşturmak için belki? Kesinlikle HB'nin hoş bir özelliği vardır - eğer bir iş parçacığı B'den önce güçlü bir şekilde gerçekleşirse, tüm iş parçacıklarının aynı şeyi gözlemleyeceğini bilir.

Tüketim tarihi:

Paul E. McKenney, C ve C ++ standartlarında tüketmekten sorumludur. İşaretçi ataması ve işaret ettiği bellek arasındaki siparişi garanti eder. DEC Alpha nedeniyle icat edildi. DEC Alpha spekülatif olarak bir göstergenin dereferansını kaldırabilir, bu nedenle bunu önlemek için bir bellek çiti de vardı. DEC Alpha artık yapılmamaktadır ve bugün hiçbir işlemcide bu davranış yoktur. Tüketmek çok rahatlamak için tasarlanmıştır.


1
İyi keder. Bu soruyu sormaktan neredeyse pişman oluyorum. Ben mücadelede geri dönmek istiyorum kolay zaman bir şablon üyesi bir taban sınıfta adım arama görünüyor, ve sizi C ++ yineleyici geçersiz kurallarına gibi sorunları, argüman bağımlı ad arama, şablon kullanıcı tanımlı dönüşüm operatörleri, şablon argümanı indirimi, bir nesnenin yapımının başlangıcında sanal bir tabana dönüşebilir.
curiousguy

Re: tüketmek. Tüketim siparişinin kaderinin DEC Alpha'nın kaderiyle bağlantılı olduğunu ve söz konusu kemer dışında bir değeri olmadığını iddia ediyor musunuz?
curiousguy

1
Bu iyi bir soru. Şimdi daha yakından bakıldığında, tüketmek teorik olarak ARM ve PowerPC gibi zayıf sıralı kemerler için performans artışı sağlayabilir gibi görünüyor. Bakmam için biraz daha zaman ver.
Humphrey Winnebago

1
Alfa dışındaki tüm zayıf sıralı ISA'lar nedeniyle tüketmenin var olduğunu söyleyebilirim . Alfa asm'de tek seçenek rahattır ve bağımlılık düzeni değil, edinir (ve seq-cst). mo_consumegerçek CPU'larda veri bağımlılığı sıralamasından yararlanmak ve derleyicinin şube tahminiyle veri bağımlılığını kıramadığını resmileştirmek için tasarlanmıştır. örneğin int *p = load(); tmp = *p;, if(p==known_address) tmp = *known_address; else tmp=*p;belirli bir işaretçi değerinin ortak olmasını beklemek için bir nedeni varsa derleyici tarafından tanıtılabilir . Bu rahatlamak için yasal ama tüketmek değil.
Peter Cordes

@PeterCordes doğru ... zayıf sıraya sahip kemerler, elde etmek için bir bellek bariyeri yaymak zorundadır, ancak (teorik olarak) tüketmek için değil. Alfa hiç var olmasaydı hala tüketiriz diye düşündüğün gibi görünüyor. Ayrıca, temelde tüketimin süslü (veya "standart") bir derleyici bariyeri olduğunu söylüyorsunuz.
Humphrey Winnebago
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.