【问题标题】:Why does unlocking a unique_lock cause my program to crash?为什么解锁 unique_lock 会导致我的程序崩溃?
【发布时间】:2018-05-10 16:26:15
【问题描述】:

关于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;
}

谁能解释为什么会这样?

【问题讨论】:

  • en.cppreference.com/w/cpp/thread/unique_lock/unlock - 如果互斥锁未锁定则抛出,当你解锁它时它不会。
  • 您知道没有必要手动解锁已被unique_lock 锁定的互斥锁?
  • 您能解释一下为什么要显式解锁互斥锁吗?另外,你能说出你认为“unique”这个词在“unique_lock”中使用的含义吗?这里的问题在于您对一些基本概念的误解,但不清楚您被误导的概念是什么,所以请告诉我们更多信息,我们可以消除您的误解。
  • 这实际上是一个错误,确实是错误。但在实际问题中,我改为调用锁来解锁,这就是导致错误的原因。
  • 特别是,您的问题与您的代码不匹配。您的问题是“为什么解锁独特的锁会崩溃?”但您并没有解锁唯一的锁。您正在解锁互斥锁。你能解释一下问题和代码之间的差异吗?

标签: c++ multithreading locking mutex


【解决方案1】:

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

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

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

lock.unlock();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2023-04-06
    • 1970-01-01
    • 2018-10-15
    • 2019-09-08
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多