将互斥锁引用从 main 传递到 class

Passing mutex reference from main to a class

我需要在主函数和 class 实例中使用相同的 mutexunique_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...
}