以下std :: queue代码示例线程安全吗?

我有以下代码示例,但不确定其是否线程安全。

void remove(/*...*/) {
    int a;
    float* data;

    while (true)
    {
        unique_lock<mutex> lock1(mu);
        cond.wait(lock1,[this](){return count > 0;});
        lock1.unlock();

        a = std_queue1.front();

        data = std_queue2.front();

        // process data

        unique_lock<mutex> lock2(mu);
        std_queue1.pop();
        std_queue2.pop();
        count--;
        lock2.unlock();
        cond.notify_all();
    }
}

void add(/*...*/){
    int a,iterations = 0;
    vector<float*> data;
    // Allocate some data entries
    while (true) {
        // set a
        unique_lock<mutex> lock1(mu);
        std_queue1.push(a);
        cond.wait(lock1,[this,&limit]() { return count < limit; });
        lock1.unlock();

        // Init data

        if (iterations++ > 2) {
            unique_lock<mutex> lock2(mu);
            std_queue2.push(data[/*...*/]);
            count++;
            lock2.unlock();
            cond.notify_all();
        }
    }
}

remove(...)和add(...)是同一类的函数。每个函数由一个线程执行,并且两个线程访问相同的队列。互斥锁被锁定以推送和弹出队列中的数据,但不用于功能front()。

所以我的问题是:这个示例线程安全吗?还是对front()函数需要互斥体?

函数pop()和push()是否需要互斥锁?
uyi745 回答:以下std :: queue代码示例线程安全吗?

所以我的问题是:这个示例线程安全吗?

否。

还是要为front()函数使用互斥锁?

是的

功能pop()和push()是否需要互斥锁?

是的

不能保证修改标准容器是线程安全的。

本文链接:https://www.f2er.com/2675344.html

大家都在问