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

标签 c++ multithreading condition-variable

我试图在 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/

相关文章:

c++ - 了解 C++ 中指针的 const 正确性

c++ - mkfifo 备选方案

c# - 使用 WF 的多线程应用程序的错误处理模式?

c++ - 是否可以使用与 2 个互斥体关联的 1 个条件变量(单独)

c++ - 为什么要使用专门的模板类?

c++ - 为什么HWND_NOTTOPMOST在xp中不能带窗口前景?

python - 将 concurrent.futures.Future 与 greenlets/gevent 一起使用

java - 在其他线程完成后调度周期性任务

c++ - 什么时候可以在没有谓词的情况下使用 std::condition_variable?

c - p_threads : Condition Variable Locking