我想知道这种情况是否(线程)安全。
有一个线程只推送到std :: queue
还有另一个线程只从std :: queue弹出。
由于队列是否为空,因此是线程安全管理的,后一个线程不会弹出失败。
请问你能帮帮我吗?
谢谢。
答案 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)时,这意味着那些函数(以及仅那些函数)可以被视为“线程安全”。推送和弹出不在列表中,因此您不能认为它们是线程安全的。
我还要补充一点,即使弹出也会实际写入数据 - 当你从容器中弹出一个项目时,需要更新容器的大小,因此推送和弹出都会写入。当多个线程写入时,您需要做一些事情以确保一次只有一个线程执行它。
总结一下:抱歉,但没有。