c – std :: queue pop push thread safety
发布时间:2020-12-16 09:55:35 所属栏目:百科 来源:网络整理
导读:基本上我的问题是:在没有同步的情况下调用前端弹出并从两个线程推送是否安全? 我已经读过这个,但从未找到明确的答案.人们说你应该使用互斥锁,但有些人暗示你可以使用两种不同的互斥锁进行推送和弹出.这是真的吗? 此代码是否具有未定义的行为? std::queue
基本上我的问题是:在没有同步的情况下调用前端弹出并从两个线程推送是否安全?
我已经读过这个,但从未找到明确的答案.人们说你应该使用互斥锁,但有些人暗示你可以使用两种不同的互斥锁进行推送和弹出.这是真的吗? 此代码是否具有未定义的行为? std::queue<int> queue; int pop() { int x = queue.front(); queue.pop(); return x; } void push(int x) { queue.push(x); } int main() { queue.push(1); std::thread t1(pop); std::thread t2(push); t1.join(); t2.join(); } 我会说这是未定义的行为,但你可以设计一个pop push safe队列,那么为什么std :: queue不是那样的呢? 解决方法
不,这不对.标准容器不是线程安全的 – 你不能从两个线程中改变它们.您必须使用互斥锁或无锁队列.问题是std :: queue必须能够处理像std :: string这样的对象,这些对象不能被原子地移动或构造,并且std :: queue也必须支持任意大小.
大多数无锁队列仅适用于机器字大小类型和固定的最大大小.如果您需要std :: queue和thread-safety的灵活性,则必须手动使用互斥锁.将互斥锁添加到默认实现中也会非常浪费,因为现在突然每个应用程序都会获得线程安全,即使它不需要它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |