Почему передача мьютекса в поток невозможна?

Передача ссылки мьютекса на поток вызывает ошибки компиляции. Почему это невозможно (у меня есть несколько потоков, использующих одну и ту же общую переменную), и как это исправить?

#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));

Демо