0

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

头文件:

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它已经被声明为引用变量,所以我不确定如何将引用从mtxto 传递给_global_mtx.

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

4

2 回答 2

7

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

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

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

于 2013-11-12T15:55:05.723 回答
0

对我来说,您的代码看起来有些混乱和混乱。

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

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

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

于 2013-11-12T16:13:44.910 回答