ホームページ  >  記事  >  バックエンド開発  >  C++ マルチスレッド プログラミングにおける読み取り/書き込みロックの目的は何ですか?

C++ マルチスレッド プログラミングにおける読み取り/書き込みロックの目的は何ですか?

WBOY
WBOYオリジナル
2024-06-03 11:16:57716ブラウズ

マルチスレッドでは、読み取り/書き込みロックにより、複数のスレッドが同時にデータを読み取ることができますが、同時実行性とデータの一貫性を向上させるために、1 つのスレッドのみがデータを書き込むことができます。 C++ の std::shared_mutex クラスは、次のメンバー関数を提供します。 lock(): 書き込みアクセスを取得します。他のスレッドが読み取りまたは書き込みロックを保持していない場合に成功します。 lock_read(): 読み取りアクセス許可を取得します。これは、他の読み取りロックまたは書き込みロックと同時に保持できます。 lock(): 書き込みアクセスを解放します。 unlock_shared(): 読み取りアクセスを解放します。

C++ 多线程编程中读写锁的用途是什么?

C++ マルチスレッド プログラミングにおける読み書きロックの目的

概要

マルチスレッド プログラミングでは、読み書きロックは、複数のスレッドが共有データを読み取れるようにする同期メカニズムです。同時に、共有データに書き込むことができるスレッドは 1 つだけです。これは、データの一貫性を確保しながら同時実行性を向上させるのに役立ちます。

実装

C++ の std::shared_mutex クラスは、読み取り/書き込みロックを実装します。次のメンバー関数が提供されます: std::shared_mutex 类实现了读写锁。它提供以下成员函数:

  • lock(): 获取锁定的写入访问权限。只有当没有其他线程持有读取或写入锁时,此函数才成功。
  • lock_read(): 获取锁定的读取访问权限。可以与其他读取锁或写入锁同时持有。
  • unlock(): 释放锁定的写入访问权限。
  • unlock_shared()
    • lock(): ロックへの書き込みアクセスを取得します。この関数は、他のスレッドが読み取りまたは書き込みロックを保持していない場合にのみ成功します。
    • lock_read(): ロックへの読み取りアクセスを取得します。他の読み取りまたは書き込みロックと同時に保持できます。
  • unlock(): ロックされた書き込みアクセスを解放します。

  • unlock_shared(): ロックへの読み取りアクセスを解放します。

    使用例

    読み取り/書き込みロックを使用して共有変数を保護する次のコードを考えてみましょう:

    #include <iostream>
    #include <shared_mutex>
    
    std::shared_mutex m;
    int shared_var = 0;
    
    void reader() {
        m.lock_read();
        std::cout << "Reading: " << shared_var << '\n';
        m.unlock_shared();
    }
    
    void writer() {
        m.lock();
        std::cout << "Writing: " << ++shared_var << '\n';
        m.unlock();
    }
    
    int main() {
        std::thread t1(reader);
        std::thread t2(writer);
        std::thread t3(reader);
        t1.join();
        t2.join();
        t3.join();
    }

    🎜出力: 🎜🎜
    Reading: 0
    Writing: 1
    Reading: 1

以上がC++ マルチスレッド プログラミングにおける読み取り/書き込みロックの目的は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。