3

我需要在主函数和类实例中mutex使用相同的内容。unique_lock但是,我无法将mutex/unique_lock地址分配给类成员变量(即 a mutex&)。

这就是我所拥有的:

工人.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);

};

工人.cpp

void Worker::start(std::mutex &mu, std::unique_lock<std::mutex> &locker)
{
    this->mu = mu; // error 
    this->locker = locker; // error
}

我试着做this->mu(mu);但这也不起作用。我能做些什么来完成这项工作吗?

谢谢。

4

2 回答 2

5

构建类时需要传递互斥体引用。

Worker::Worker(std::mutex &mu, std::unique_lock<std::mutex> &locker)
:m_mu(mu), locker(locker)
{}

这是唯一可以初始化引用的地方。一旦构建完成,您就无法更改它引用的内容。

为什么需要储物柜?互斥体进行同步,锁只是一个 RAII 对象,以方便获取互斥体。

于 2018-10-17T15:44:46.287 回答
3

您不需要将锁定对象传递给函数。只要该类引用了正确的互斥锁,您就可以将互斥锁锁定在函数内部,如下所示:

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...
}
于 2018-10-17T17:43:59.727 回答