unique_lock是個類模板,工作中,一般lock_guard(推薦使用);lock_guard取代了mutex的lock()和unlock();
unique_lock比lock_guard靈活很多,效率上差一點,記憶體占用多一點。
lock_guard可以帶第二個引數
std::lock_guardsbguard1(my_mutex1, std::adopt_lock);// std::adopt_lock標記作用;
表示這個互斥量已經被lock*(你必須要把互斥量提前lock了 ,否者會報異常);
std::adopt_lock標記的效果就是假設呼叫一方已經擁有了互斥量的所有權(已經lock成功了);通知lock_guard不需要再建構函式中lock這個互斥量了。
unique_lock也可以帶std::adopt_lock標記,含義相同,就是不希望再unique_lock()的建構函式中lock這個mutex。
用std::adopt_lock的前提是,自己需要先把mutex lock上;用法與lock_guard相同。
我們會嘗試用mutex的lock去鎖定這個mutex,但是如果沒有鎖定成功,我也會立即返回,並不會阻塞,
用這個try_to_lock的前提時自己不能先lock。實現**如下;
用std::defer_lock的前提是,你不能自己先lock,否則會報異常#include#include#include#include#include#includeusing namespace std;
class a
else
}} }
bool outmsglulproc(int &command)
return false;
} //把資料從訊息佇列取出的執行緒
void outmsgrecvqueue()
else
}cout << "end!" << endl; }
private:
std::listmsgrecvqueue;//容器(訊息佇列),代表玩家傳送過來的命令。
std::mutex my_mutex;//建立乙個互斥量(一把鎖)};
int main()
std::defer_lock的意思就是並沒有給mutex加鎖:初始化了乙個沒有加鎖的mutex。
我們藉著defer_lock的話題,來介紹一些unique_lock的重要成員函式
defer_lock、lock()與unlock() 例項** 如下 :
嘗試給互斥量加鎖,如果拿不到鎖,返回false,如果拿到了鎖,返回true,這個函式是不阻塞的;例項**如下:void inmsgrecvqueue()
}
返回它所管理的mutex物件指標,並釋放所有權;也就是說,這個unique_lock和mutex不再有關係。嚴格區分unlock()與release()的區別,不要混淆。void inmsgrecvqueue()
else
}}
如果原來mutex對像處於加鎖狀態,你有責任接管過來並負責解鎖。(release返回的是原始mutex的指標)。例項**如下:
為什麼有時候需要unlock();因為你lock()鎖住的**段越少,執行越快,整個程式執行效率越高。有人也把鎖頭鎖住的**多少成為鎖的粒度,粒度一般用粗細來描述;void inmsgrecvqueue()
}
a)鎖住的**少,這個粒度叫細,執行效率高;
b)鎖住的**多,這個粒度叫粗,執行效率低;
要學會盡量選擇合適粒度的**進行保護,粒度太細,可能漏掉共享資料的保護,粒度太粗,影響效率。
選擇合適的粒度是高階程式設計師能力和實力的體現;
std::unique_lockstd::mutex sbguard(my_mutex);//所有權概念
sbguard擁有my_mutex的所有權;sbguard可以把自己對mutex(my_mutex)的所有權轉移給其他的unique_lock物件;
所以unique_lock物件這個mutex的所有權是可以轉移,但是不能複製。
std::unique_lockstd::mutex sbguard1(my_mutex);
std::unique_lockstd::mutex sbguard2(sbguard1);//此句是非法的,複製所有權是非法的
方法1 :std::move()std::unique_locksbguard2(std::move(sbguard));//移動語義,現在先當與sbguard2與my_mutex繫結到一起了
//現在sbguard1指向空,sbguard2指向了my_mutex
方法2:return std:: unique_lockstd::mutex **如下:
std::unique_lockrtn_unique_lock()
void inmsgrecvqueue()
}
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功能更加強大的加鎖機制。它可以提供彈性加鎖服務。即使用者指定加鎖的地方,也可以指定解鎖的地方。還可以將鎖的所有權進行轉讓。以下 除了第一行都可以預設。std unique lock std mutex locker mu,std defer lock...