マルチスレッド同時実行 STL に基づく再帰ロック recursive_mutex

1: 説明

1. recursive_mutex クラスは、複数のスレッドによる同時アクセスから共有データを保護するために使用できる同期プリミティブです。
2. recursive_mutex は、排他的な再帰所有権セマンティクスを提供します。
3. recursive_mutex の使用シナリオの 1 つは、クラス内の共有状態を保護することであり、クラスのメンバー関数は相互に呼び出すことができます。

2: 使用法:

recursive_mutex の使用法は mutex の使用法に似ています。複数のスレッドが同じ変数に同時にアクセスすることを制限するために使用されます。ロックして、複数のスレッドが同時に変数を変更できるのは 1 つのスレッドのみであることを保証するために使用されます。 mutex と異なる場合、recursive_mutex は同じものを許可できます スレッドは再帰的にロックし、ロックの数と解放時間が同じ場合にのみスレッドは変数の制御を解放します。たとえば、fun1 は次の fun2 で呼び出されます。 , しかし、fun1 と fun2 の両方がロックされています。ミューテックスが使用されている場合、fun1 をロックし、fun2 で再度ロックするとデッドロックが発生します。そのため、 recursive_mutex を使用すると、再帰的にネストされた呼び出しによって引き起こされるデッドロックの問題を回避できます。再帰呼び出しはデッドロックせず、同じスレッドが使用します。 recursive_mutex は時間をロックおよびロック解除します。等しい場合は制御を解放します。

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

class X {
    
    
    std::recursive_mutex m;
    std::string shared;
public:
    void fun1() {
    
    
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun1";
        std::cout << "in fun1, shared variable is now " << shared << '\n';
    }
    void fun2() {
    
    
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun2";
        std::cout << "in fun2, shared variable is now " << shared << '\n';
        fun1(); // 递归锁在此处变得有用
        std::cout << "back in fun2, shared variable is " << shared << '\n';
    };
};

int main()
{
    
    
    X x;
    std::thread t1(&X::fun1, &x);
    std::thread t2(&X::fun2, &x);
    t1.join();
    t2.join();
}

ここに画像の説明を挿入
間違いや不足がある場合は、コメントやご指摘をお待ちしております。作成は簡単ではありませんので、転載の際は出典を明記してください。お役に立ちましたら、ぜひ「いいね」とフォローをお願いいたします (⊙o⊙)
詳細については、私の個人ブログをフォローしてください: https://blog.csdn.net/qq_43148810

おすすめ

転載: blog.csdn.net/qq_43148810/article/details/130645778