簡體   English   中英

在互斥鎖未鎖定時調用解鎖?

[英]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

std::mutex::unlock

互斥鎖必須由當前執行線程鎖定,否則行為未定義。

因此,您的代碼在嘗試解鎖未鎖定的互斥體時具有未定義的行為。

使用標准 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 的lockunlock成員函數。

cppreference

std::mutex::unlock 解鎖互斥鎖。 互斥鎖必須由當前執行線程鎖定,否則行為未定義。

所以不,你不能這樣做。 相反,您必須通過使用std::lock_guard或其他方式來跟蹤您是否鎖定了它。

暫無
暫無

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

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