首页 > 解决方案 > 为什么我不能用 lock_guard 锁定两个互斥锁

问题描述

我知道我应该使用std::scoped_lock同时锁定两个互斥锁。但我不知道为什么。

我读过这篇文章std::lock_guard 或 std::scoped_lock? . 但我没有找到任何人解释为什么std::lock_guard版本会出现死锁。

#include <mutex>
#include <thread>

std::mutex mtx1;
std::mutex mtx2;

auto main(int argc, char* argv[]) -> int {
  std::mutex mtx1;
  std::mutex mtx2;

  const auto thread_func = [&] {
    std::scoped_lock lock(mtx1, mtx2);

    // Why I can't lock like this
    // std::lock_guard<std::mutex> lock1(mtx1);
    // std::lock_guard<std::mutex> lock2(mtx2);
  };

  std::thread th1(thread_func);
  std::thread th2(thread_func);

  th1.join();
  th2.join();

  return 0;
}

谁可以给我解释一下这个?谢谢你。

Godbolt中的代码

标签: c++mutex

解决方案


推荐阅读