【问题标题】:Const reference in getter method [closed]getter方法中的常量引用[关闭]
【发布时间】:2011-09-19 17:25:09
【问题描述】:

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

你可能特别喜欢。想看看使用模板的类的出列函数。

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

【问题讨论】:

  • 这是作业吗?您究竟需要什么帮助?
  • 为什么你认为有问题?或者你想要一个一般的代码审查?如果是这样,请访问 codereview.stackexchange.com,您将被告知此摘录没有足够的上下文进行审查。
  • 对不起,如果它看起来模棱两可。问题在这里: T &data = _queue.back(); Ppl 可能会说存在参考悬空问题。这是我想知道的。

标签: c++ queue constants synchronized ref


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    只是没有。

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

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

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

    【讨论】:

    • 我同意你的看法。但实际上,这个实现是 stl::queue 的一个包装器,用于使用 pthread 提供一些同步的东西。它是简单的理解要求。
    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多