1

我有一个 ( std::)queue / (std::)deque由一个线程推送并由另一个线程弹出。所以我知道我必须在 push 和 pop 函数上锁定一个互斥锁,因为它们正在修改队列,但是如果我访问 front(),我是否也必须锁定一个互斥锁?

我问的原因是,我真的不知道队列是如何在内部组织的。我读过一些它正在按时分配/删除的东西。所以如果我在另一个线程正在推动的同时阅读前面,是否有可能移动前面

那么迭代器呢?当迭代器读取值时,我是否还必须锁定互斥锁?

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

4

1 回答 1

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();

例如。

于 2013-02-26T10:49:46.857 回答