Передача ссылки на мьютекс от основного к классу

Мне нужно работать с тем же 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 ответа

Решение

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

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

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

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

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

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...
}
Другие вопросы по тегам