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...