"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.
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.
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.
seq_cst
in, : 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.