The Chromium Chronicle #25: थ्रेड की सुरक्षा से जुड़े एनोटेशन

एपिसोड 25: SFO में विक्टर कोस्टन का एपिसोड (अक्टूबर 2021)
पिछले एपिसोड

C++ में, डेटा के चलने की संभावना होने पर, डेटा के हर सदस्य को ऐक्सेस करने के लिए, थ्रेड की सुरक्षा के एक छोटे से सही सबूत का इस्तेमाल किया जाता है. इन सबूतों से आपकी मानसिक मेहनत बढ़ती है, खासकर तब, जब कोड की समीक्षा या उसे रीफ़ैक्टर करते समय ऐसा किया जाता है. Clang के स्टैटिक विश्लेषण फ़्रेमवर्क का इस्तेमाल, थ्रेड की सुरक्षा के सबूतों के लिए किया जाता है.

थ्रेड-असुरक्षित क्लास के डेटा सदस्यों में GUARDED_BY_CONTEXT() को जोड़ें

ज़्यादातर Chrome क्लास, थ्रेड के लिए असुरक्षित होती हैं. इनका इस्तेमाल एक ही क्रम में किया जाना चाहिए. डेटा के उन सभी सदस्यों के लिए एनोटेशन जोड़ें जो थ्रेड के साथ सुरक्षित नहीं हैं. गै़र-ज़रूरी एनोटेशन सुरक्षित होते हैं, लेकिन बिना एनोटेशन के उपलब्ध न होने से डेटा मिलने का खतरा रहता है.

#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, क्रम की जांच लागू करता है

डेटा मेंबरशिप के सदस्यों की जानकारी देने के लिए, Clang यह पक्का करता है कि डेटा को ऐक्सेस करने वाला कोई भी तरीका, ऐसा करने से पहले सिलसिलेवार तरीके से सुरक्षा जांच करे. कोड रीफ़ैक्टरिंग में बदलाव होने पर, Clang, GUARDED_BY_CONTEXT() एनोटेशन को लागू करना जारी रखता है.

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() को जोड़ें

Chrome की कुछ क्लास में थ्रेड की सुरक्षा के लिए लॉक का इस्तेमाल करना ज़रूरी है. इन मामलों में, डेटा के उन सभी सदस्यों के बारे में बताएं जो थ्रेड के साथ सुरक्षित नहीं हैं. हर जानकारी एक म्यूटेक्स पर ले जाती है जिसे डेटा सदस्य को ऐक्सेस करते समय रखा जाना चाहिए.

#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 की मदद से, ऐप्लिकेशन इंस्टॉल करने वाले लोगों को लॉक किया जा सकता है

थोड़ा इंतज़ार करें और कंपाइलर को यह पक्का करने दें कि हर base::AutoLock सही तरीके से स्कोप किया गया हो. साथ ही, यह पक्का करने के लिए कि लॉक Acquire() और Release() कॉल सही तरीके से जोड़े गए हों.

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