C ++ Programlama Dili: C ++ 26'da Tehlikeli Bölümler

Saberie

Active member


  1. C ++ Programlama Dili: C ++ 26'da Tehlikeli Bölümler

C ++ 26 tehlike işaretçisini tanıtır. P2530R3 teklifi ne olduğuna dair iyi bir açıklama sağlar:










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.







Tehlike işaretçisi, iş parçacığının çoğuna herhangi bir zamanda sahip olabilen tek bir yazar çok okuyucu işaretçisidir. Yalnızca tehlike işaretçisi değerini ayarlayabilirken, herhangi bir iş parçacığı numarası değerini okuyabilir. Dinamik nesnelere erişmek üzere olan bir iş parçacığı, araştırma nesnelerini kurtarılandan korumak için tehlikeli bölümlerin sahipliğini elde eder. İş parçacığı, bir tehlike işaretçisinin değerini ayarlar ve nesneyi, araştırma nesnesini kaldırabilen rakip iş parçacıklarını belirtmek için belirtir. Bu nesnenin iyileşmesi henüz güvenli değildir.

Tehlikeli bölümler, aksesuarlar/koruyucular olarak işlev gören iş parçacıklarına aittir ve yazılır (yani araştırma nesnelerine erişmek için istekli olmayan iyileştirmelerden çıkarılabilir nesneleri korur) ve azaltılmış/şikayet görevi gören iş parçacıklarıdır (nesneleri kaldırabilir ve kurtarmaya çalışabilirler). Çıkartma, tehlike işaretçi kitaplığında kaldırılan nesneleri geri çeker (yani, nesneleri normal olarak kullanıcı kodu yerine kitaplık koduna kurtaramamak). Koruma ve kaldırma iplikleri kümesi örtüşebilir.

Koruma ve Kurtarma


Kısacası, tehlikeli bölümler, artık gerekli değilse referanslı nesnelerin ortadan kaldırıldığını garanti eder. Tehlikeli epizodlar koruyucu ve gecikmiş kurtarma fonksiyonları gerçekleştirir ve birbirleriyle etkileşime girer.

  • Koruma: Nesnelerin ancak artık gerekli olmadıkları takdirde yok edileceğini garanti edin.
  • Kurtarma Alın: Çekilen nesneleri toplar ve değerlerini bir kümede çıkarır. Tüm tehlikeli epizodların değerlerini okur ve bunları kümede çıkarılan değerlerin adresleriyle karşılaştırır. Tehlikeli bölümlerin değerlerinde setten bir değer bulunmazsa, yok edilebilir. Bulunduğunda, geri çekilen nesnelerin kümesine eklenir.
Doğruluk ve performans




Tehlikelerin tehlikelerinin avantajları nelerdir? Cevabım iki noktadan oluşuyor: adalet ve performans. Doğruluk basit bir örnek kullanılarak gösterilebilir:



Node* currentNode = this->head;
Node* nextNode = currentNode->next;



Kodun bu küçük boyun çizgisiyle ilgili önemli soru şudur: currentNode Hala geçerli mi? Bir iş parçacığı bu kodu gerçekleştirirken, başka bir iş parçacığı zaten işgal edebilir currentNode İLE.

Atomik tartışma ve takas işlemleri bu sorunu sıkılaştırıyor. C ++ 'da, işlem genellikle bu amaçla compare_exchange_strong kullanılmış. Ancak, CAS operasyonları ABA probleminden muzdariptir. ABA sorunu, C ++ 26'daki ertelenmiş makale ıslahımda daha ayrıntılı bir şekilde tartışılıyor: okuma okuma güncellemesi ve tehlikeli bölümler. Sorunun çözümü açıktır: otomatik çöp toplama. Tehlikelerin tehlikeleri tam olarak budur.

C ++ 14 ile okuyucuların yazar ışıkları tanıtıldı. Bu özel bloklarla, okuma iplikleri yazı iş parçacığından farklı muamele görür. Bu, herhangi bir sayıda okuma iş parçacığının aynı anda gerçekleştirilebileceği, ancak yalnızca bir yazma iş parçacığının gerçekleştirilebileceği anlamına gelir. Sonuç olarak, okuyucuların yazarları özel bloklara kıyasla performansta bir iyileşme vaat ediyor.

P2530R3 teklifi, esas olarak okunan bir veri yapısına iyi bir örnek sağlar. Klasik bir okuyucu yazarı ve bir tehlike işaretçisi kullanılır.








Teklifin tablosu, kodu tehlikeli hedeflerle ve tehlikeli hedeflerle karşılaştırır.


(Resim: Açık Standartlar (Open-Std.org))



Yaratılış veya eleme sırasında tipik gecikme hazard_pointer Mevcut bir standart sunucuda deliliğin uygulanmasında yaklaşık 4 ns. Bir Ön -Yaratılış hazard_pointer Bir nanosaniyeden daha az kullanmak için kullanın, genellikle korumayı aktive etmek için gerekir.

Facebook Açık Kütüphanesi'nin deliliği, tehlikelerin referansının uygulanmasını sunar.

Sınıflar ve işlevler


Tehlikelerin tehlikeleri iki sınıftan oluşur hazard_pointer_obj_base VE hazard_pointer iki işlevin yanı sıra make_hazard_pointer VE swap.

  • hazard_pointer_obj_base Korunacak sınıfın temel sınıfıdır ve işlev sağlar retire hazır.
  • hazard_pointer İşlevleri koy empty,, protect,, try_protect,, reset_protection VE swap mevcut
  • make_hazard_pointer Bir tehlike işaretçisi oluşturun.
Sırada ne var?


RCU, okuma kopyasını güncellemek içindir ve neredeyse sadece okunaklı olan veri yapıları için bir senkronizasyon tekniğidir. Paul McKenney, 2002'den beri Linux çekirdeğinde kullanılan teknolojiyi geliştirdi


(RME)
 
Üst