-3

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

你可能会特别。喜欢查看使用模板的类的出队功能。

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

2 回答 2

3

dequeue中,您返回一个悬空引用。一旦你popped 了这个对象,它就不再存在了。

于 2011-06-21T17:07:50.540 回答
1

就是不行。

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

线程安全在于不同时访问数据,而不仅仅是在数据结构上放置一个互斥体并将其称为完成。

其次,如果您构建一个并发容器,它们确实存在并且它们是必要的,那么您将拥有一个完全不同的界面。看一下 Intel 的 TBB 和 Microsoft 的 PPL 的并发数据结构。他们有一个专为并发使用而设计的界面,这将比您的 slap-a-mutex-on-it hack 更快且错误更少。

于 2011-06-21T17:10:16.493 回答