为什么解锁unique_lock导致我的程序崩溃?

iHo*_*ell 0 c++ multithreading mutex locking

我遇到了一些奇怪的行为unique_lock。创建它之后,我尝试调用解锁,但是它使我的程序崩溃。我创建了一个最小示例,该示例在解锁功能上始终崩溃(使用gdb进行确认)。

#include <iostream>
#include <string>
#include <mutex>
#include <thread>
#include <chrono>

std::mutex myMutex;

void lockMe()
{
  std::unique_lock lock(myMutex);
  std::cout << "Thread\n";
}

int main()
{
  std::unique_lock lock(myMutex);
  auto c = std::thread(lockMe);
  std::this_thread::sleep_for(std::chrono::seconds(1));
  std::cout << "Main\n";
  myMutex.unlock();
  c.join();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会这样?

use*_*670 6

通过创建,std::unique_lock lock(myMutex);您可以将互斥锁/解锁控制授予lock对象。如果在互斥lock对象仍处于对象控制之下时对其进行手动解锁,则会违反该约束,并且lock析构函数将执行两次解锁尝试。

它与所有RAII包装器相似-将资源控制权授予RAII对象后,您不应通过手动处置资源来干扰它。

请注意,std::unique_lock该方法提供了一种在作用域结束之前解锁锁定的互斥锁的方法,该方法不会引起问题:

lock.unlock();
Run Code Online (Sandbox Code Playgroud)