getter方法中的Const引用

时间:2011-06-21 17:04:52

标签: c++ queue const synchronized ref

请您查看此代码。我相信这里没有错。

尤其如此。喜欢查看使用模板的类的出列函数。

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;
    }

2 个答案:

答案 0 :(得分:3)

dequeue中,您会返回一个悬空参考。一旦你pop踩了 对象,它不复存在。

答案 1 :(得分:1)

没有。

首先,你不能只是在它上面打一个互斥锁并称之为线程安全。这不仅会在不必要时产生可怕的开销,而且还会破坏某些操作的原子性 - 例如,如果我检查队列的大小然后是否超过队列的大小,则无法保证零,从队列中取出一个 - 因为有人可能在此期间将其清空。或者,如果我取下一个物体,现在它被弹出了怎么办?糟糕。

线程安全在不能同时访问数据,而不仅仅是在数据结构中清除互斥锁并调用它。

其次,如果你 要构建一个并发容器,它们确实存在并且它们是必需的,那么你有一个完全不同的接口。查看英特尔TBB和微软PPL的并发数据结构。它们有一个专为并发使用而设计的界面,它比你的slap-a-mutex-on-it hacks更快,更少出错。