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

时间:2014-09-11 20:22:09

标签: c++ c++11 condition-variable

我有一部分代码,其中一个线程调用类似的东西:

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 $在这里做错了什么?如果是的话,我该如何解决这个问题?

1 个答案:

答案 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)。