【发布时间】:2020-01-14 13:20:04
【问题描述】:
我正在尝试借助 std::mutex 和 std::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,但输出是随机的1 或2,这意味着它不是线程安全的。为什么这个特定的程序不起作用?
【问题讨论】:
-
适合您的工作示例:stackoverflow.com/a/49669316/412080
-
检查我的 tlock:codeproject.com/Articles/1186797/…
-
感谢您的建议,但我想了解我的代码有什么问题。如果有请建议我
-
@AbhinavSingh 我已经告诉过你了。没有。它正在工作。唯一错误的是您对应该发生的事情的期望......
标签: c++ multithreading condition-variable