C++ getter方法中的常量引用

C++ getter方法中的常量引用,c++,queue,constants,synchronized,ref,C++,Queue,Constants,Synchronized,Ref,你能检查一下这个代码吗。我相信这里没有问题 您可能特别喜欢查看使用模板的类的出列函数 void enqueue(const T &data) { _mutex.lock(); _queue.push(data); _mutex.unlock(); } T const& dequeue() { _mutex.lock(); T &data = _queue.back()

你能检查一下这个代码吗。我相信这里没有问题

您可能特别喜欢查看使用模板的类的出列函数

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

在出列中,返回一个悬空引用。一旦你
pop
ped了 对象,它就不存在了。

只是不存在

首先,你不能在它上面加一个互斥锁,然后称之为线程安全。这不仅会在不必要的情况下产生可怕的开销,而且还会破坏某些操作的原子性——例如,你不能保证如果我检查队列的大小,然后如果它大于零,就从队列中去掉一个——因为可能有人同时清空了它。或者如果我把一个物体拿下来,现在它被弹下来了呢?哎呀

线程安全在于不并发访问数据,而不仅仅是在数据结构上插入互斥锁并调用它


其次,如果您要构建一个并发容器,它们确实存在并且是必需的,那么您就有了一个完全不同的接口。看看Intel的TBB和Microsoft的PPL的并发数据结构。他们有一个为并发使用而设计的界面,它将比你的slap-a-mutex-on-it黑客更快、更少的bug。

这是家庭作业吗?你到底需要什么帮助?为什么你认为有什么不对劲?或者你想要一个通用的代码检查?如果是这样,请访问codereview.stackexchange.com,在那里您将被告知此摘录没有足够的上下文进行审阅。如果它看起来模棱两可,请道歉。问题是:T&data=_queue.back();Ppl可能会说有一个悬而未决的问题。这就是我想知道的,我同意你的看法。但实际上,这个实现是stl::queue的包装器,用于使用pthread提供一些同步功能。它被简单地理解了需求。