gpt4 book ai didi

c++ - 线程安全队列C++

转载 作者:行者123 更新时间:2023-12-01 14:40:00 24 4
gpt4 key购买 nike

我试图在 std::mutexstd::condition_variable 的帮助下用 C++ 创建一个线程安全队列。代码

#include <iostream>
#include<thread>
#include<queue>
#include<atomic>
#include<mutex>
#include<condition_variable>

using namespace std;

template<class T>
class SafeQueue{
public:
queue<T>qu;
mutex mut;
condition_variable cv;
SafeQueue(){}
SafeQueue(queue<T>q):qu(q){}
void push(int val){
unique_lock<mutex>uq(mut);
cv.wait(uq,[&](){return qu.empty();});
qu.push(val);
uq.unlock();
}
bool isEmpty(){
// unique_lock<mutex>uq(mut);
// uq.unlock();
cv.notify_all();
return qu.empty();
}
};
void inc(SafeQueue<int>& sq){
for(int i=0;i<10;i++)
continue;
if(sq.isEmpty())
sq.push(1);
}
void inc1(SafeQueue<int>& sq){
for(int i=0;i<10;i++)
continue;
if(sq.isEmpty())
sq.push(2);
}

int main(){
queue<int>qu;
SafeQueue<int> sq(qu);
thread t1(inc,ref(sq));
thread t2(inc1,ref(sq));
t1.join();
t2.join();
cout<<sq.qu.front();
}

线程安全队列应该在末尾输出1,但输出是随机的12,这意味着它是不是线程安全的。为什么这个特定的程序不工作?

最佳答案

并不意味着该程序不是线程安全的。这并不意味着它定义不明确并且可能会崩溃。

这只是意味着您的程序逻辑并未编写为以任何特定顺序将项目添加到队列中。

如果您希望以特定顺序添加这两个项目,请从一个线程中推送这两个项目。

线程安全并不意味着您的应用程序运行时就像只有一个线程一样。

您的程序运行良好。

关于c++ - 线程安全队列C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59734615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com