C++同時-反発元

1600 ワード

1.std::mutexクラス
1.コンストラクション関数、std::mutexはコピー構造もmoveコピーも許可されず、最初に生成されたmutexオブジェクトはunlocked状態にある.2.lock()は、呼び出しスレッドが反発量をロックします.スレッドがこの関数を呼び出すと、1反発量が現在ロックされていない場合、unlockが呼び出されるまでスレッドがロックされます.②現在の反発量が他のスレッドによってロックされている場合、現在の呼び出しスレッドはブロックされる.③現在の反発量が現在の呼び出しスレッドによってロックされている場合、デッドロックが発生する.3.unlock()は、ロックを解除し、反発量の所有権を解放する.unlockとlockを組み合わせて使用する.関数から離れたパスごとにunlockを呼び出す必要があります.
2.std::lock_guardクラス
std::lock_guardは比較的簡単に使用され、構造関数以外にメンバー関数はありません.メリットはペアリングなし
#include 
#include 
#include 
std::mutex some_mutex;
void add()
{
	std::lock_guard<:mutex> guard(some_mutex);
}

3.std::unique_を使用するロックフレキシブルロック
ロック粒度を実現するためにstd::lock_guardは柔軟性が足りないように見えます.一例:include include include std::mutex some_mutex; void add(){//こちらのカッコは、std::lock_guardstd::mutex guard(some_mutex);//do something_1}//do something_2
{
	std::lock_guard<:mutex> guard(some_mutex);
	//do something_3
}

}unique_の使用lock void add(){std::unique_lockstd::mutex lock_1(some_mutex,std::defer_lock);//反発元を未ロックstd::lock(lock_1);//反発元はここでロック//do something_1 std::unlock(lock_1);//do something_2 std::lock(lock_1);//do something_3 std::unlock(lock_1);}
4.デッドロックを回避するために、同じ順序で反発要素をロックする
std::lock関数の使用
std::mutex m1,m2;
void mutexer()
{
	std::lock(m1, m2); //        

	//      ,            ,       ,         
	std::lock_guard<:mutex> lock_1(m1, std::adopt_lock);
	std::lock_guard<:mutex> lock_2(m2, std::adopt_lock);
}