VS2012中的c ++ 11 thread/mutex实现 - 断言被触发

Dan*_*iel 4 c++ multithreading mutex c++11 visual-studio-2012

我想将我的代码从boost-移动到std-threads.虽然我认为它应该是非常直接的,但我遇到了奇怪的问题.下面的代码是一个最小的示例,它使用VS2012触发断言"f:\ dd\vctools\crt_bld\self_x86\crt\src\thr\mutex.c(131):unowned mutex的解锁".搜索这会导致旧的错误报告(我认为)应该已经修复.

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

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

谢谢

bam*_*s53 11

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

  • @Daniel:不要使用原始互斥体.使用`std :: lock_guard`代替安全的SBRM防护. (3认同)
  • 它反映了其他互斥API中的要求,只有互斥锁所有者才能放弃其所有权.Pthread互斥锁和Windows关键部分都有此限制.您应该使用什么取决于您尝试使用它们的内容. (2认同)