C ++从传入的引用变量中分配引用变量?

时间:2013-11-12 15:52:50

标签: c++ c++11

我试图避免使用全局变量,因为我不知道代码将来需要如何扩展,因此我希望能够生成具有独立互斥锁的多个线程。我正在尝试将Mutex和条件变量传递给类构造函数。

标题文件:

class Receiver {
private:
    std::mutex & _global_mtx;
    std::condition_variable & _global_cv;
    bool & state;
public:
    // Construct
    Receiver(std::mutex &, std::condition_variable &, bool &);
};

代码文件:

/*-------------------------------------
    Construct
--------------------------------------*/
Receiver::Receiver(std::mutex & mtx, std::condition_variable & cv, bool & state){
    _global_mtx = mtx;
}

这显然会导致问题,因为_global_mtx已经被声明为引用变量,所以我不确定如何将引用从mtx传递给_global_mtx

另外,我知道在声明引用时你必须为它指定一个值来引用(可能是NULL)所以有没有更好的方法来处理它我正在做什么?我确信我不是第一个也是唯一一个遇到这种需求的人,但我不确定在哪里寻找答案。

2 个答案:

答案 0 :(得分:7)

参考不能默认初始化。他们必须提到一些东西。所以你必须初始化 _global_mutex。在构造函数初始化列表中执行:

Receiver::Receiver(std::mutex & mtx, std::condition_variable & cv, bool & state)
: _global_mtx(mtx),
  _global_cv(cv),
  state(state)
{
}

这同样适用于其他数据成员。

答案 1 :(得分:0)

对我来说,你的代码看起来有点困惑和困惑。

在大多数情况下,互斥锁(以及,如果您使用的是相关的条件变量)应该直接与某些数据相关联。换句话说:你有一段数据将在线程之间共享。您将互斥锁与该数据相关联以保护它,因此一次只有一个线程可以访问数据。

在这种情况下,您通常希望使用共享数据的实例和互斥锁以及(如果需要)条件变量来设计您的类。你几乎从不想单独创建它们,然后在你的问题中尝试将它们提供给类。虽然您可以通过使用成员初始化列表来修复初始化引用的近期(主要是语法)问题,但这很少是正确的答案。

在大多数情况下,正确的答案是所有成员都是同一个对象的成员,并提供对成员数据执行操作的成员函数,根据需要锁定和解锁mutext。