我有一部分代码,其中一个线程调用类似的东西:
cond->notify_all();
delete cond;
与
std::condition_variable_any cond;
Afaik,这应该有效,因为I should be allowed to delete the condition variable, as soon as I notified all threads waiting on it,他们不必从等待电话中恢复。
在Windows上,这有时会因为错误而崩溃:
mutex destroyed while busy
打印到stdout
在Linux上,使用 clang 3.5 这非常合适,在Windows上使用 Visual Studio 2013,v120 takeit ,v120是默认值。
我做错了什么,我错过了解标准,还是M $在这里做错了什么?如果是的话,我该如何解决这个问题?
答案 0 :(得分:4)
Microsoft std::condition_variable_any
的实现不符合要求。根据{{3}},这已经在尚未发布的VS14中得到修复:
我们已经实现了30.5.2 [thread.condition.condvarany] / 5指定的极其微妙的规则:
~condition_variable_any()
需要:
*this.
[注意:上没有线程被阻止。也就是说,所有线程都已被通知;他们可能随后阻止等待中指定的锁定。这放宽了通常的规则,这将要求所有等待呼叫在破坏之前发生。只有取消阻止等待的通知必须在销毁之前发生。一旦析构函数启动,用户必须注意确保没有线程在*this
上等待,特别是当等待的线程在循环中调用wait函数或使用wait
的重载时,{{ 1}}或wait_for
采用谓词。 -end note ](DevDiv#484720)。