如果只有推送线程和仅弹出线程,C ++ std :: queue是否安全?

时间:2013-07-16 02:50:08

标签: c++ multithreading thread-safety queue

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

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

请问你能帮帮我吗?

谢谢。

1 个答案:

答案 0 :(得分: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 seems to agree)时,这意味着那些函数(以及那些函数)可以被视为“线程安全”。推送和弹出不在列表中,因此您不能认为它们是线程安全的。

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

总结一下:抱歉,但没有。