我有一个( std::)队列 / (std::) deque ,它由一个线程推送并由另一个线程弹出。所以我知道我必须在推送和弹出功能上锁定一个互斥锁,因为它们正在修改队列,但如果我访问前面(),我还必须锁定一个互斥锁吗?
我问的原因是,我真的不知道如何在内部组织队列。我已经阅读了需要按时分配/删除的内容。所以,如果我在另一个线程正在推动时读取前面,可能是前移动?
迭代器怎么样? 我还必须在迭代器读取值时锁定互斥锁吗?
我认为在读取时锁定互斥锁总是一个好主意,但我不确定是否真的需要在每个迭代器/前端访问上锁定整个queue.mutex。如果它每次都锁定,它可能会减慢整个程序。
答案 0 :(得分:2)
std::queue
只是一个适配器,在内部使用std::deque
或std::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();
例如。