C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – std :: queue pop push thread safety大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
基本上我的问题是:在没有同步的情况下调用前端弹出并从两个线程推送是否安全?
我已经读过这个,但从未找到明确的答案.人们说你应该使用互斥锁,但有些人暗示你可以使用两种不同的互斥锁进行推送和弹出.这是真的吗?

代码是否具有未定义的行为?

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的灵活性,则必须手动使用互斥锁.将互斥锁添加认实现中也会非常浪费,因为现在突然每个应用程序都会获得线程安全,即使它不需要它.

大佬总结

以上是大佬教程为你收集整理的c – std :: queue pop push thread safety全部内容,希望文章能够帮你解决c – std :: queue pop push thread safety所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。