ক্রোমিয়াম ক্রনিকল #25: থ্রেড সেফটি টীকা

পর্ব 25: SFO-তে ভিক্টর কস্টান দ্বারা (অক্টোবর, 2021)
আগের পর্বগুলো

C++-এ, ডেটা রেসের সম্ভাবনা বাতিল করে প্রতিটি ডেটা সদস্যের অ্যাক্সেসের জন্য একটি ছোট থ্রেড-নিরাপত্তা শুদ্ধতা প্রমাণে নেমে আসে। এই প্রমাণগুলি অনেক মানসিক পরিশ্রম যোগ করে, বিশেষ করে কোড পর্যালোচনা বা রিফ্যাক্টর করার সময়। ঝনঝন এর স্ট্যাটিক বিশ্লেষণ ফ্রেমওয়ার্ক থ্রেড-নিরাপত্তা প্রমাণের পরিশ্রম গ্রহণ করে

থ্রেড-অনিরাপদ ক্লাসে ডেটা সদস্যদের সাথে GUARDED_BY_CONTEXT() যোগ করুন

বেশিরভাগ ক্রোম ক্লাস থ্রেড-অনিরাপদ, এবং একটি একক অনুক্রমে ব্যবহার করা উচিত। থ্রেড-নিরাপদ নয় এমন সমস্ত ডেটা সদস্যদের টীকা যোগ করুন। অপ্রয়োজনীয় টীকা নিরাপদ, কিন্তু অনুপস্থিত টীকা ডেটা রেসের ঝুঁকি।

#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_);
};

ঝনঝন ক্রম চেক প্রয়োগ করে

ডেটা সদস্যদের টীকা দেওয়ার বিনিময়ে, ক্ল্যাং নিশ্চিত করে যে ডেটা অ্যাক্সেস করে এমন কোনও পদ্ধতি এটি করার আগে একটি ক্রম সুরক্ষা পরীক্ষা করে। যেহেতু কোড রিফ্যাক্টরিং-এ ঘুরিয়ে দেওয়া হয়, ক্ল্যাং 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_);
};

ঝনঝন তালা অধিগ্রহণ বলবৎ

হ্যাং ব্যাক করুন এবং কম্পাইলারকে নিশ্চিত করুন যে প্রতিটি 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);
}