Передача ссылки на мьютекс от основного к классу - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно работать с одинаковыми 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);но это тоже не работает.Что я могу сделать, чтобы сделать эту работу?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вам не нужно передавать объект lock в функцию.Пока класс ссылается на правильный мьютекс , вы можете заблокировать мьютекс внутри функции следующим образом:

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...
}
0 голосов
/ 17 октября 2018

Вам нужно передать ссылку на мьютекс, когда вы создаете свой класс.

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

Это единственное место, где вы можете инициализировать ссылку.Как только он сконструирован, вы не можете изменить то, на что он ссылается.

Зачем вам шкафчик?Мьютекс выполняет синхронизацию, блокировка - это просто объект RAII, облегчающий получение мьютекса.

...