将互斥锁引用从 main 传递到 class
Passing mutex reference from main to a class
我需要在主函数和 class 实例中使用相同的 mutex
和 unique_lock
。但是,我无法将 mutex
/unique_lock
地址分配给 class 成员变量(即 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)
;但这也不管用。我可以做些什么来完成这项工作吗?
谢谢。
您需要在构造 class 时传递互斥锁引用。
Worker::Worker(std::mutex &mu, std::unique_lock<std::mutex> &locker)
:m_mu(mu), locker(locker)
{}
这是唯一可以初始化引用的地方。一旦构造完成,您就无法更改它所引用的内容。
为什么需要储物柜?互斥量进行同步,锁只是一个 RAII 对象,以便于获取互斥量。
您不需要将 lock 对象传递给函数。只要 class 指的是正确的 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...
}
我需要在主函数和 class 实例中使用相同的 mutex
和 unique_lock
。但是,我无法将 mutex
/unique_lock
地址分配给 class 成员变量(即 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)
;但这也不管用。我可以做些什么来完成这项工作吗?
谢谢。
您需要在构造 class 时传递互斥锁引用。
Worker::Worker(std::mutex &mu, std::unique_lock<std::mutex> &locker)
:m_mu(mu), locker(locker)
{}
这是唯一可以初始化引用的地方。一旦构造完成,您就无法更改它所引用的内容。
为什么需要储物柜?互斥量进行同步,锁只是一个 RAII 对象,以便于获取互斥量。
您不需要将 lock 对象传递给函数。只要 class 指的是正确的 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...
}