簡體   English   中英

boost scoped_lock vs普通鎖定/解鎖

[英]boost scoped_lock vs plain lock/unlock

我將使用boost/thread/mutex.hpp boost::mutex 有幾種方法可以鎖定/解鎖互斥鎖:使用scoped_lockunique_locklock_guard ,互斥鎖的成員函數::lock()::unlock()以及非成員函數lock()unlock()

我注意到, boost::scoped_mutex是最流行的使用互斥鎖的方法之一。 為什么它更適合成員函數::lock()::unlock()

特別是,我為什么要使用

{
  boost::scoped_lock lock(mutex)
  // ...
  // read/output sharing memory.
  // ...
}

而不是

mutex.lock()
// ...
// read/output sharing memory.
// ...
mutex.unlock()

scoped_lock更好只是因為一些樣式編碼的觀點或是::lock()/::unlock()不是“線程足夠安全”?

為什么它更適合成員函數:: lock()和:: unlock()?

出於同樣的原因,為什么RAII成語在一般情況下變得流行(這只是其無數例中的一個):因為你可以確定你不會在不解鎖互斥鎖的情況下離開當前范圍。

請注意,這不僅僅是忘記調用unlock() :當你的互斥鎖被鎖定時可能會發生異常,並且可能永遠不會達到你對unlock()調用,即使你的調用之間沒有任何return語句。 lock()和你對unlock()調用。

m.lock() // m is a mutex
// ...
foo(); // If this throws, your mutex won't get unlocked
// ...
m.unlock()

在這種情況下,將在堆棧展開期間調用scoped_lock防護的析構函數,確保關聯的互斥鎖始終被釋放。

{
    boost::scoped_lock lock(m); // m is a mutex
    // ...
    foo(); // If this throws, your RAII wrapper will unlock the mutex
    // ...
}

此外,在許多情況下,這將提高代碼的可讀性,因為您不必在每個return語句之前添加對unlock()的調用。

您可以使用

std::lock_guard<std::mutex> lock(mutex);

如果不想使用boost庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM