请您查看此代码。我相信这里没有错。
尤其如此。喜欢查看使用模板的类的出列函数。
void enqueue(const T &data)
{
_mutex.lock();
_queue.push(data);
_mutex.unlock();
}
T const& dequeue()
{
_mutex.lock();
T &data = _queue.back();
_queue.pop();
_mutex.unlock();
return data;
}
答案 0 :(得分:3)
在dequeue
中,您会返回一个悬空参考。一旦你pop
踩了
对象,它不复存在。
答案 1 :(得分:1)
没有。
首先,你不能只是在它上面打一个互斥锁并称之为线程安全。这不仅会在不必要时产生可怕的开销,而且还会破坏某些操作的原子性 - 例如,如果我检查队列的大小然后是否超过队列的大小,则无法保证零,从队列中取出一个 - 因为有人可能在此期间将其清空。或者,如果我取下一个物体,现在它被弹出了怎么办?糟糕。
线程安全在不能同时访问数据,而不仅仅是在数据结构中清除互斥锁并调用它。
其次,如果你 要构建一个并发容器,它们确实存在并且它们是必需的,那么你有一个完全不同的接口。查看英特尔TBB和微软PPL的并发数据结构。它们有一个专为并发使用而设计的界面,它比你的slap-a-mutex-on-it hacks更快,更少出错。