c++ - 为什么解锁 unique_lock 会导致我的程序崩溃?

标签 c++ multithreading locking mutex

我遇到了一些关于 unique_lock 的奇怪行为。创建它之后,我尝试调用 unlock,但它使我的程序崩溃。我创建了一个最小的示例,该示例始终在解锁功能上崩溃(使用 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;
}

谁能解释为什么会这样?

最佳答案

通过创建 std::unique_lock lock(myMutex);,您将互斥锁定/解锁控​​制授予锁定对象。如果您在互斥锁仍在 lock 对象的控制下时手动解锁它,您将违反该约束并且 lock 析构函数将执行双重解锁尝试。

它类似于所有 RAII 包装器 - 一旦您将资源控制权授予 RAII 对象,您就不应该通过手动处置资源来干扰它。

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

lock.unlock();

关于c++ - 为什么解锁 unique_lock 会导致我的程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50277398/

相关文章:

c++ - 禁用 Visual Studio 绿色箭头按钮移动指令指针

c++ - 模板元编程与经典名称重载相结合

java - 我应该让我所有的 java 代码线程安全吗?

postgresql - PostgreSQL COPY 方法需要什么锁?

c++ - 如何将 std::find_if 与唯一指针 vector 一起使用?

c++ - 多类中的多线程

multithreading - Scala:WAITING列表被填充

c++ - 内联替换会导致多线程代码中的无限循环吗?

c# - Sqlite 数据库被锁定

c# - 锁定字典的 TryGetValue() - 性能问题