Цитата из Николай Йосуттис - Стандартная библиотека C ++ 11 :
Отдельные потоки могут легко стать проблемой, если они используют нелокальные ресурсы.Проблема в том, что вы теряете контроль над отдельным потоком и у вас нет простого способа узнать, работает ли он и как долго.Таким образом, убедитесь, что отсоединенный поток не имеет доступа к каким-либо объектам после окончания их срока службы.По этой причине передача переменных и объектов в поток по ссылке всегда сопряжена с риском.Передача аргументов по значению настоятельно рекомендуется.
Далее автор объясняет, что даже если вы передаете ссылку в качестве аргумента функции потоку, она все равно передается по значению, поэтому вы должны указать ссылку с помощью std::ref
.
У меня есть эти вопросы, см. Код ниже:
void f(std::vector<int> V){...}
void g(std::vector<int>& V){...}
std::vector<int> V;
std::thread t1(f, V);
std::thread t2(f, std::ref(V));
std::thread t3(g, V);
std::thread t4(g, std::ref(V));
Каковы различия в этих 4 строках?Какие строки эквивалентны?
Я не присоединяюсь и не отсоединяю поток, речь не об этом, а о способах передачи аргумента функции.