【问题标题】:c++11 thread/mutex implementation in VS2012 - assertion firedVS2012中的c ++ 11线程/互斥锁实现-触发断言
【发布时间】:2012-12-21 13:04:47
【问题描述】:

我想将我的代码从 boost-threads 移到 std-threads。虽然我认为这应该很直接,但我遇到了奇怪的问题。下面的代码是一个使用 VS2012 触发断言“f:\dd\vctools\crt_bld\self_x86\crt\src\thr\mutex.c(131):unlock of unowned mutex”的最小示例。搜索这个会弹出older bug reports(我认为)应该已经修复了。

int result = 0;
std::mutex m;
m.lock();
std::thread t1([&](){
    result = 42;
    m.unlock();
});
m.lock();
std::cout << result << std::endl;
t1.join();

有人可以向我解释为什么这不起作用吗?

谢谢

【问题讨论】:

  • 你锁定m 两次?

标签: c++ multithreading c++11 visual-studio-2012 mutex


【解决方案1】:

m.unlock() 要求调用线程拥有互斥锁。您的代码不符合该要求(因为unlock()ing 线程从不调用m.lock()),因此程序的行为未定义。

【讨论】:

  • 我对这种限制感到惊讶 - 从未受到它的影响。我想这是条件变量的一个很好的用例?!
  • 它反映了其他互斥体 API 中的要求,即只有互斥体所有者才能放弃其所有权。 Pthread 互斥锁和 Windows 临界区都有这个限制。您应该使用什么取决于您尝试使用它们的目的。
  • @Daniel:不要使用原始互斥锁。使用std::lock_guard 代替安全的SBRM 保护。
  • @Daniel 是的,条件变量比锁更适合这种用途。
  • 或者std::promise也许
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2015-05-03
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多