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

Мне нужно работать с тем же 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, облегчающий получение мьютекса.

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...
}
1

По вопросам рекламы [email protected]