基本上是對std::unique_lock的翻譯。
unique_lock
比lock_guard
更加靈活,不單單是通過控制物件的構造與析構來實現lock
和unlock
,因為其有lock
和unlock
的成員函式,而lock_guard
只有構造和析構函式。
乙個unique_lock
物件用來管理mutex
物件。
在構造(或者移動構造)時,unique_lock
物件獲得mutex
物件。
如:
#include
std::mutex mtx;
//先有乙個mutex物件
std::unique_lock<:mutex>
lkc(mtx)
;//然後用mutex物件構造unique_lock物件
unique_lock
類保證在析構時mutex
是unlocked
狀態,因此在丟擲異常時也能保證mutex
是unlocked
。
unique_lock
的成員函式如下:
下面來介紹幾個。
建構函式挺多的:
unique_lock() noexcept;
不管理mutex物件。
explicit unique_lock (mutex_type& m);
管理m並且呼叫m.lock();
#include
std::mutex mtx;
//先有乙個mutex物件
std::unique_lock<:mutex>
lkc(mtx)
;//然後用mutex物件構造unique_lock物件
unique_lock (mutex_type& m, try_to_lock_t tag);
管理m並呼叫m.try_lock();
std::unique_lock<:mutex>
lkc(m, std::try_to_lock)
;
unique_lock (mutex_type& m, defer_lock_t tag) noexcept;
管理m但是不執行lock;
std::unique_lock<:mutex>
lck(m, defer_lock)
;
該函式直接呼叫所管理的mutex
物件的lock
函式,所以如果其所管理的mutex
物件已經被鎖住了,那麼執行緒會阻塞。當函式返回的時候,說明the object owns a lock on the mutex.
函式沒有引數也沒有返回值,呼叫失敗會丟擲system_error異常。
使用示例:
#include
#include
#include
std::mutex mtx;
void
print_thread_id
(int id)
intmain()
執行結果:
;返回值:
true isthe object owns a lock on the managed mutex object.
false otherwise.
檢查 *this 是否擁有已鎖的互斥。
呼叫的是管理的mutex
物件的unlock()
;
解鎖關聯互斥並釋放所有權。
若無關聯互斥或互斥未被鎖則丟擲std::system_error
。
嘗試鎖定關聯互斥而不阻塞。等效地呼叫mutex()->try_lock()
。
若無關聯互斥或關聯互斥已被此std::unique_lock
鎖定則丟擲std::system_error
。
#include
#include
#include
#include
using
namespace std;
mutex mtx;
void
print_star()
intmain()
執行結果:
如果unique_lock lck(mtx, defer_lock);換為unique_lock lck(mtx, try_to_lock);,執行時會丟擲異常:
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詳解
unique lock是個類模板,工作中,一般lock guard 推薦使用 lock guard取代了mutex的lock 和unlock unique lock比lock guard靈活很多,效率上差一點,記憶體占用多一點。lock guard可以帶第二個引數 std lock guardsbg...
c 多執行緒程式設計 unique lock
unique lock是乙個比lock guard功能更加強大的加鎖機制。它可以提供彈性加鎖服務。即使用者指定加鎖的地方,也可以指定解鎖的地方。還可以將鎖的所有權進行轉讓。以下 除了第一行都可以預設。std unique lock std mutex locker mu,std defer lock...