c c 多執行緒 unique lock的使用

2022-05-18 01:26:43 字數 1360 閱讀 1845

unique_lock的特點:

1,靈活。可以在建立unique_lock的例項時,不鎖,然後手動呼叫lock_a.lock()函式,或者std::lock(lock_a, …),來上鎖。當unique_lock的例項被析構時,會自動呼叫unlock函式,釋放鎖。

unique_locklock_a(d1.m, std::defer_lock);
2,unique_lock的例項可以呼叫unlock函式。這個意味著,在unique_lock的例項銷毀前,你可以有選擇的在程式的分支釋放鎖。持有鎖的時間比所需時間更長,可能會導致效能下降,因為其他等待該鎖的執行緒,被阻止執行的時間超過了所需的時間。

注意:有個弊端,當不擁有鎖的時候,呼叫了unlock成員方法,程式崩潰。崩潰資訊如下:

terminate called after throwing an instance of 'std::system_error'

what(): operation not permitted

aborted (core dumped)

3,可以在作用域之間轉移鎖的所有權。右值的話,會自動被轉移;左值的話,必須手動呼叫std::move()函式,來進行鎖的所有權的轉移。

通常使用這種模式,是在待鎖定的互斥元依賴於程式的當前狀態,或者依賴於傳遞給返回std::unique_lock物件的函式的地方。

例子:關於上述第一點和第二點的

#include #include #include #include #include #include using namespace std;

class data_protect;

void swap(data_protect& , data_protect& );

//是執行緒安全的

class data_protect;

mutex m;

public:

void add_list(int val)

bool contains(int val)

};void swap(data_protect& d1, data_protect& d2)

}int main()

github源**

例子:關於上述的第三點

#include std::unique_lockgetlock()

void process_data()

int main()

github源**

C 多執行緒,unique lock

lock guard unique lock 缺省會自己加鎖和釋放鎖 uniquq lock的第二個引數 mutex mymutex std unique lock mylock mymutex,std adopt lock std unique lock mylock mymutex,std tr...

C 多執行緒 unique lock

基本上是對std unique lock的翻譯。unique lock比lock guard更加靈活,不單單是通過控制物件的構造與析構來實現lock和unlock,因為其有lock和unlock的成員函式,而lock guard只有構造和析構函式。乙個unique lock物件用來管理mutex物件...

c 多執行緒unique lock詳解

unique lock是個類模板,工作中,一般lock guard 推薦使用 lock guard取代了mutex的lock 和unlock unique lock比lock guard靈活很多,效率上差一點,記憶體占用多一點。lock guard可以帶第二個引數 std lock guardsbg...