C 多執行緒 unique lock

2021-10-02 03:19:22 字數 2910 閱讀 4986

基本上是對std::unique_lock的翻譯。

unique_locklock_guard更加靈活,不單單是通過控制物件的構造與析構來實現lockunlock,因為其有lockunlock的成員函式,而lock_guard只有構造和析構函式。

乙個unique_lock物件用來管理mutex物件。

在構造(或者移動構造)時,unique_lock物件獲得mutex物件。

如:

#include

std::mutex mtx;

//先有乙個mutex物件

std::unique_lock<:mutex>

lkc(mtx)

;//然後用mutex物件構造unique_lock物件

unique_lock類保證在析構時mutexunlocked狀態,因此在丟擲異常時也能保證mutexunlocked

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