在notify_all崩溃后直接删除std::condition_variable_any

Ong*_*ngy 5 c++ condition-variable c++11

我有一部分代码,其中一个线程调用如下内容:

cond->notify_all();
delete cond;
Run Code Online (Sandbox Code Playgroud)

std::condition_variable_any cond;
Run Code Online (Sandbox Code Playgroud)

Afaik,这应该可行,因为我应该被允许删除条件变量,一旦我通知所有等待它的线程,它们就不必从等待调用中恢复。

在 Windows 上,有时会因错误而崩溃:

mutex destroyed while busy
Run Code Online (Sandbox Code Playgroud)

打印到标准输出

在linux上,使用clang 3.5,这工作得很好,在Windows上,我使用Visual Studio 2013,使用v120 takeit,v120是默认的。

是我做错了什么,是我误解了标准,还是 M$ 在这里做错了什么?如果是这样,我该如何解决这个问题?

Cas*_*sey 4

Microsoft 的实现std::condition_variable_any不符合标准。根据Visual Studio 14 CTP1 中的 C++14 STL 功能、修复和重大更改,此问题已在尚未发布的 VS14 中修复:

我们已经实现了 30.5.2 [thread.condition.condvarany]/5 指定的极其微妙的规则:

~condition_variable_any()

要求:*this. [上不得有任何线程被阻塞。 注意:即所有线程都已被通知;他们随后可能会阻塞在等待中指定的锁上。这放宽了通常的规则,通常的规则要求所有等待调用都在销毁之前发生。只有解除阻塞等待的通知必须在销毁之前发生。用户必须注意确保析构函数启动后没有线程等待*this,特别是当等待线程在循环中调用等待函数或使用waitwait_for、 或wait_until采用谓词的重载时。-结束注]

(DevDiv#484720)。