C++ における読み取り/書き込みロックの概念

Muhammad Adil 2023年12月11日
  1. リーダー/ライター ロックの目的と用途
  2. C++ でリーダー/ライター ロックを実装する手順
C++ における読み取り/書き込みロックの概念

リーダー/ライター ロックは、スレッドが読み取りまたは書き込みのためにロックを取得できるようにする同期メカニズムです。これにより、リソースが変更されている間、あるスレッドが別のスレッドにリソースへのアクセスをブロックしないようにします。

これらは、グローバル キャッシュや ルックアップ テーブル などの読み取り専用の共有データ構造を実装するためによく使用されます。 リーダー/ライター ロックは、条件変数またはミューテックスのいずれかを使用して実装できます。

リーダー/ライター ロックの目的と用途

リーダー ロックは、リーダーがデータを変更できない場合に使用されます。 ライター ロックは、ライターがデータを変更するために排他的アクセスを必要とする場合に使用されます。

リーダー ロックは読み取り専用ロックとも呼ばれ、マルチユーザー システムでよく見られます。 1つまたは複数のリーダーがデータに影響を与えずにアクセスできるようにしますが、ライターはデータへの排他的アクセス権を持っている場合にのみデータを変更できます。

一方、ライター ロックは、一度に 1 人のユーザーのみがファイルに変更を書き込む必要がある場合に使用されます。 これにより、同時書き込みが防止され、異なる人が異なる時間に行った更新の間で競合が発生しなくなります。

C++ でリーダー/ライター ロックを実装する手順

C++ では、リーダー/ライター ロックをいくつかの手順で実装できます。

  1. まず、ロックによって保護されるリソースへの shared_ptr を使用して、ロックを初期化する必要があります。
  2. 次に、必要に応じてロックを取得および解放する関数を作成する必要があります。
  3. 第 3 に、acquire 関数と release 関数を適切なタイミングで呼び出す必要があります。
  4. 第 4 に、他のスレッドが同じリソースをすでに保持しているのを待っているかどうかをチェックする関数を作成する必要があります。
  5. 5 番目に、ステップ 2 の acquire および release 関数からこの関数を呼び出します。

例:

#include <iostream>
#include <mutex>
#include <shared_mutex>
#include <thread>

using namespace std;

class demo {
 public:
  void sam() {
    unique_lock lock(mutex_);
    ++b;
  }

  unsigned int get() {
    shared_lock lock(mutex_);
    return b;
  }

 private:
  mutable shared_mutex mutex_;
  unsigned int b = 0;
};

int main() {
  demo tbh;

  auto sam_and_roi = [&tbh]() {
    for (int x = 0; x < 6; x++) {
      tbh.sam();
      cout << this_thread::get_id() << tbh.get() << '\n';
    }
  };

  thread start(sam_and_roi);
  start.join();
}

ここをクリック 上記の例の動作を確認します。

著者: Muhammad Adil
Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook