将互斥体引用从main传递到类

时间:2018-10-17 15:41:49

标签: c++ multithreading mutex unique-lock

我需要在主要函数和类实例中使用相同的mutexunique_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);但这也不起作用。我有什么可以做的吗?

谢谢。

2 个答案:

答案 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...
}