我需要在主要函数和类实例中使用相同的mutex
和unique_lock
。但是,在将mutex
/ unique_lock
地址分配给类成员变量(即mutex&
)时遇到麻烦。
这就是我所拥有的:
Worker.h
class Worker
{
private:
std::mutex &m_mu;
std::unique_lock<std::mutex> &locker;
public:
void start(std::mutex &mu, std::unique_lock<std::mutex> &locker);
};
Worker.cpp
void Worker::start(std::mutex &mu, std::unique_lock<std::mutex> &locker)
{
this->mu = mu; // error
this->locker = locker; // error
}
我尝试做this->mu(mu)
;但这也不起作用。我有什么可以做的吗?
谢谢。
答案 0 :(得分:3)
构造类时,您需要传递互斥体引用。
Worker::Worker(std::mutex &mu, std::unique_lock<std::mutex> &locker)
:m_mu(mu), locker(locker)
{}
那是唯一可以初始化引用的地方。构建完成后,您将无法更改其引用。
为什么需要储物柜?互斥锁进行同步,锁只是一个RAII对象,可以轻松获取互斥锁。
答案 1 :(得分:1)
您不需要将 lock 对象传递给函数。只要该类引用正确的 mutex ,您就可以将互斥锁锁定在函数内部,如下所示:
class Worker
{
private:
std::mutex& m_mu;
public:
Worker(std::mutex& mu): m_mu(mu) {} // bind reference during initialization
void start();
};
// Worker.cpp
void Worker::start()
{
std::unique_lock<std::mutex> locker(m_mu); // lock the shared resource
// Do something with it here
}
int main()
{
std::mutex mu;
std::vector<Worker> workers(4, Worker(std::ref(mu)));
// etc...
}