![](/img/trans.png)
[英]Does pthread_cond_signal function unlock the mutex the calling thread locked?
[英]Calling unlock on mutex when it's not locked?
我有一個這樣的 if 分支:
MLOCK.lock();
if (CPRIMES[snode->cid] == snode) {
CPRIMES.erase(snode->cid);
log("[remove_storage_node] Node " + kv_addr + " dropped as primary", VB);
MLOCK.unlock();
elect_new_primary(snode->cid);
}
MLOCK.unlock();
我想確保在調用elect_new_primary
之前以及在代碼塊的末尾解鎖鎖。 這是不好的做法嗎? 確保以這種方式解鎖鎖的更好方法是什么?
此答案假定MLOCK
指的是標准互斥鎖 object std::mutex
。
互斥鎖必須由當前執行線程鎖定,否則行為未定義。
因此,您的代碼在嘗試解鎖未鎖定的互斥體時具有未定義的行為。
使用標准 class std::unique_lock
可以最好地解決這類問題。 這個 class 將管理鎖,當它自己的生命周期結束時,如果它仍然被鎖定,它將確保解鎖互斥鎖。
例如:
#include <mutex>
std::mutex m;
void foo(bool b)
{
// Lock `m` and take ownership of that lock
std::unique_lock<std::mutex> lock{m};
if(b) {
// Unlocks `m`
lock.unlock();
}
} // `m` will be unlocked if it wasn't unlocked previously
您應該很少求助於直接調用mutex
object 的lock
或unlock
成員函數。
從cppreference :
std::mutex::unlock 解鎖互斥鎖。 互斥鎖必須由當前執行線程鎖定,否則行為未定義。
所以不,你不能這樣做。 相反,您必須通過使用std::lock_guard
或其他方式來跟蹤您是否鎖定了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.