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

Delete std::condition_variable_any directly after notify_all crashes

本文关键字:std condition variable any 删除 all notify 崩溃      更新时间:2023-10-16

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

cond->notify_all();
delete cond;

带有

std::condition_variable_any cond;

Afaik,这应该有效,因为应该允许我删除条件变量,只要我通知所有等待它的线程,他们就不必从wait调用中恢复。

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

mutex destroyed while busy

打印到标准输出

在linux上,使用clang 3.5,效果非常好,在windows上,我使用Visual Studio 2013,使用v120工具包时,v120是默认版本。

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

Microsoft对std::condition_variable_any的实现不符合要求。根据Visual Studio 14 CTP1中的C++14 STL功能、修复和突破性更改这已在尚未发布的VS14:中修复

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

~condition_variable_any()

要求:*this.上不得有螺纹堵塞[注意:也就是说,所有线程都应该得到通知;它们随后可能会阻塞等待中指定的锁。这放宽了通常的规则,即要求所有等待调用都必须在销毁之前发生。只有解除阻止等待的通知必须在销毁前发生。用户必须注意确保在销毁程序启动后,没有线程在*this上等待arted,尤其是当等待线程在循环中调用等待函数时,或者使用采用谓词的waitwait_forwait_until的重载时-尾注]

(DevDiv#484720)。