C ++: Oliver Schadlich'ten “Atomic>” a Öneri – Bir Deney

Maglup

Co-Admin
Bu blog makalesi bir deneyi temsil ediyor: Birkaç gün önce Oliver Schadlich'ten aşağıda E -Mail aldım. Eğer bu makale, umarım bir tartışmayı serbest bırakırsa, bir sonraki makalemde özetlemekten mutluluk duyarım. Lütfen Rainer Grimm'e bir e -mail yazın.










Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.







Oliver Schadlich'in postası:

“RCU'nun Haberler dış kısmı ile Tehlike İşaretçisi hakkındaki mevcut makalenizi okudum. YouTube'daki derslerden esinlenerek bloklar olmadan varyantlara atomic<shared_ptr<>> Bir kez düşündüğümde: Bu kadar karmaşık olmamalısın. Prensip olarak bir şey gibi bir şey sevebilirsin atomic<shared_ptr<>> Block ile uygulamak yeterlidir ve güncellenirken shared_ptr<> Merkezden atomic<shared_ptr<>> Atomik arasında bir karşılaştırma olacak shared_ptr gerçekleştirildi.

Kural olarak, RCU ile bir kontrol ünitesine sahip benzer motifler atomic<shared_ptr<>> Bu nadiren güncellenir, ancak çoğu zaman geçerli değerin bir güncellemesi elde edilir. Kural olarak, her iki önerinin de aynı şeyi göstermesi, çekmeyin ve süper hızlı bir güncelleme yapmayın, çünkü ilgili önbelleklerin tüm satırları açılmaya devam ediyor shared ayakta duruyor.

VS 2022 ile uyguladım ve shared_obj<T> Merkezden tshared_obj<> Zen4 CPU'mda yaklaşık 1,5 nanosaniye mal oluyor. Çözüm o kadar basit ki, neden kimsenin bizi neden icat etmediğini merak ediyordum.

Prensipte yapabilirsin shared_ptr<> C ++ 'dan bir atama operatörü verin atomic<shared_ptr<>> Aynı şeyi alır. Şu anda çalışıyor atomic<shared_ptr<>> Sonra shared_ptr<> Kastet ve nispeten pahalı bir kopya yükselir. LIBSTDC ++ ve MSVC şu anda bu noktada bir abluka ile çalışıyor, bu da belirtilen özel durum için açıklandığı gibi hareket ederseniz henüz bir sorun olmayacak. Belki de bir sonraki standartlardan herhangi birinde böyle bir şeyin bulunabileceği fikrini uygun yere getirmeye devam edebilirsiniz.

İşte Oliver Schaich'in bana gönderdiği kod. C ++ 20 ile yazılmıştır ve standart kütüphaneyi kullanır. Dosyalar:



  • Futex.cpp
  • Main.cpp
  • cl_size.h
  • Futex.h
  • Shared_obj.h
İndirme Kaynakları

En ilginç olanı paylaşılan file_obj.Terat aşağıdaki işlevdir:



template<typename T>
shared_obj<T> &shared_obj<T>::eek:perator =( tshared_obj<T> const &tso ) noexcept
{
using namespace std;
ctrl_t *ctrl = tso.m_ctrl.load( memory_order_relaxed );
if( ctrl == m_ctrl )
return *this;
if( m_ctrl )
{
if( m_ctrl->decr() == 1 )
delete m_ctrl;
m_ctrl = nullptr;
}
lock_guard<typename tshared_obj<T>::mutex_t> lock( tso.m_mtx );
ctrl = tso.m_ctrl.load( memory_order_relaxed );
m_ctrl = ctrl;
ctrl->incr();
return *this;
}



Ben ilk ne zaman if ile return *this Kod, birkaç bin kat daha yavaş, birinin güncellemesi kadar yavaş shared_ptr<> birinden atomic<shared_ptr<>>.

Nasıl devam ediyorsun?


RCU, neredeyse tamamen Paul McKenney tarafından geliştirilen korumalı veri yapıları için bir senkronizasyon teknolojisi olan ve 2002'den beri Linux çekirdeğinde kullanılmaktadır. RCU şu anda tehlikeli bölümlerle ilgili olarak belirtilmiştir.


(DSÖ)



> “-An deneyi” veri izleme içeriği = “Gift_Curtain” Google-Curtain>


Ne yazık ki, bu bağlantı artık geçerli değil.

Boşa harcanan eşyalara olan bağlantılar, 7 günlük daha büyükse veya çok sık çağrılmışsa gerçekleşmez.


Bu makaleyi okumak için bir Haberler+ paketine ihtiyacınız var. Şimdi yükümlülük olmadan bir hafta deneyin – yükümlülük olmadan!