让我在队列前端访问上锁定互斥锁

时间:2013-02-26 10:29:58

标签: c++ multithreading iterator queue

我有一个( std::)队列 / (std::) deque ,它由一个线程推送并由另一个线程弹出。所以我知道我必须在推送和弹出功能上锁定一个互斥锁,因为它们正在修改队列,但如果我访问前面(),我还必须锁定一个互斥锁吗?

我问的原因是,我真的不知道如何在内部组织队列。我已经阅读了需要按时分配/删除的内容。所以,如果我在另一个线程正在推动时读取前面,可能是前移动

迭代器怎么样? 我还必须在迭代器读取值时锁定互斥锁吗?

我认为在读取时锁定互斥锁总是一个好主意,但我不确定是否真的需要在每个迭代器/前端访问上锁定整个queue.mutex。如果它每次都锁定,它可能会减慢整个程序。

1 个答案:

答案 0 :(得分:2)

std::queue只是一个适配器,在内部使用std::dequestd::list

您不仅可以在读取时锁定队列,还可以等待条件变量并检查是否有可用的数据。如果你有这个设置

std::queue<int> q;
std::mutex m;
std::condition_variable cv;

然后你可以等待提供数据的其他线程

std::unique_lock<std::mutex> guard(m);
while(q.empty())
    cv.wait(guard);

int n = q.front();
q.pop();

将在数据可用时通知

cv.notify_one();

例如。