4

我想知道这种情况是否(线程)安全。

有一个线程只推送到 std::queue。
还有另一个线程只从 std::queue 中弹出。
由于队列是否为空,都是线程安全管理的,所以后面的线程不会弹出失败。

请问你能帮帮我吗?

谢谢你。

4

1 回答 1

9

我相信答案是否定的。

该标准说(§23.2.2/1):

为避免数据竞争 (17.6.5.9),实现应将以下函数视为 const:begin、end、rbegin、rend、front、back、data、find、lower_bound、upper_bound、equal_range、at 和,除了关联或无序的关联容器,operator[]。

至少正如我所解释的那样(Herb Sutter 似乎同意),这意味着这些函数(并且只有那些函数)可以被视为“线程安全”。Push 和 pop 不在列表中,所以你不能假设它们是线程安全的。

我还要补充一点,即使弹出实际上也会写入数据——当你从容器中弹出一个项目时,容器的大小需要更新,所以推送和弹出都会写入。当多个线程进行写入时,您需要做一些事情来确保一次只有一个线程执行。

总结一下:对不起,但没有。

于 2013-07-16T03:07:09.953 回答