让我在队列前端访问时锁定互斥对象

have i to lock mutex on queue front access

本文关键字:锁定 对象 访问 队列 前端      更新时间:2023-10-16

我有一个(std::(队列/(std::。所以我知道我必须在push和pop函数上锁定互斥体,因为它们正在修改队列,但如果我访问front((,我是否也必须锁定互斥体?

我之所以这么问,是因为我真的不知道队列内部是如何组织的。我读到一些东西,它是分配/删除的时间,它是需要的。因此,如果我在另一个线程推动的同时读取前面,有可能前面被移动了吗?

迭代器怎么样迭代器读取值时,我是否也必须锁定互斥对象

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

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

例如。