我试图避免使用全局变量,因为我不知道代码将来需要如何扩展,因此我希望能够生成具有独立互斥锁的多个线程。我正在尝试将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)所以有没有更好的方法来处理它我正在做什么?我确信我不是第一个也是唯一一个遇到这种需求的人,但我不确定在哪里寻找答案。
答案 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。