Почему передача мьютекса в поток невозможна?
Передача ссылки мьютекса на поток вызывает ошибки компиляции. Почему это невозможно (у меня есть несколько потоков, использующих одну и ту же общую переменную), и как это исправить?
#include<iostream>
#include<thread>
#include<mutex>
void myf(std::mutex& mtx)
{
while(true)
{
// lock
// do something
// unlock
}
}
int main(int argc, char** argv)
{
std::mutex mtx;
std::thread t(myf, mtx);
t.join();
return 0;
}
Ответы
Ответ 1
thread
копирует свои аргументы:
Сначала конструктор копирует/перемещает все аргументы...
std::mutex
не копируется, следовательно, ошибки. Если вы хотите передать его по ссылке, вам нужно использовать std::ref
:
std::thread t(myf, std::ref(mtx));
Демо