Chromium Chronicle #25: İş Parçacığı Güvenliğiyle İlgili Ek Açıklamalar

Bölüm 25: Victor Costan, SFO'da (Ekim 2021)
Önceki bölümler

C++'ta, veri yarışı olasılığını elemek, her veri üyesi erişimi için iş parçacığı güvenliğiyle ilgili küçük bir doğruluk kanıtı oluşturur. Bu kanıtlar, özellikle kodları gözden geçirirken veya yeniden düzenlemeye çalışırken çok fazla zihinsel sıkıntıya yol açar. Clang'in statik analiz çerçevesi, iş parçacığı güvenliğini kanıtlamak için gereken iş yükünü üstlenir.

İleti dizisi açısından güvenli olmayan sınıflardaki veri üyelerine GUARDED_BY_CONTEXT() ekleyin

Çoğu Chrome sınıfı, ileti dizisi açısından güvenli değildir ve tek bir dizide kullanılmalıdır. İleti dizisi açısından güvenli olmayan tüm veri üyelerine ek açıklama ekleyin. Gereksiz ek açıklamalar güvenlidir ancak eksik ek açıklamalar veri yarışına yol açabilir.

#include "base/sequence_checker.h"  // for SEQUENCE_CHECKER()
#include "base/thread_annotations.h"  // for GUARDED_BY_CONTEXT()

class Cache {
  // Methods here.
 private:
  SEQUENCE_CHECKER(sequence_checker_);
  base::flat_map<std::string, std::string> data_ GUARDED_BY_CONTEXT(sequence_checker_);
};

Clang, dizi kontrollerini zorunlu kılar

Veri üyelerine not verirken Clang, verilere erişen tüm yöntemlerin bunu yapmadan önce bir dizi güvenlik kontrolü gerçekleştirmesini sağlar. Yeniden düzenlemede kod taşınırken Clang, GUARDED_BY_CONTEXT() ek açıklamasını uygulamaya devam ediyor.

void Cache::Set(base::StringPiece key, base::StringPiece value) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);  // Clang warns without this.
  data_.emplace(key, value);
}

GUARDED_BY() adlı parçayı, zaman aralığı açısından güvenli olan ve karşısındakiler kullanan veri üyelerine ekleyin

Chrome'daki bazı sınıflar, iş parçacığı güvenliği için kilitler kullanmalıdır. Bu durumlarda, iş parçacığı için güvenli olmayan tüm veri üyelerine açıklama ekleyin. Her ek açıklama, veri üyesine erişirken tutulması gereken bir karşılıklı dışlamaya işaret eder.

#include "base/thread_annotations.h"  // for GUARDED_BY()

class ThreadSafeCache {
  // Methods here.
  private:
    base::Lock lock_;
    base::flat_map<std::string, std::string> data_ GUARDED_BY(lock_);
};

Clang, kilit edinmeleri zorunlu kılıyor

Bekleyin ve derleyicinin, her base::AutoLock kapsamının doğru şekilde ayarlandığından emin olun. Bu kilit Acquire() ve Release() çağrıları doğru şekilde eşlenmiş.

void ThreadSafeCache::Set(base::StringPiece key, base::StringPiece value) {
  base::AutoLock auto_lock(lock_);  // Clang warns without this.
  data_.emplace(key, value);
}