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