Разница в передаче аргумента в std :: thread, C ++ - PullRequest
0 голосов
/ 21 мая 2018

Цитата из Николай Йосуттис - Стандартная библиотека 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 строках?Какие строки эквивалентны?
Я не присоединяюсь и не отсоединяю поток, речь не об этом, а о способах передачи аргумента функции.

1 Ответ

0 голосов
/ 21 мая 2018

t1:

Это просто передает копию V в поток.

t2:

Аналогично t1, копияV передается потоку, но фактическая копия создается в вызываемом потоке, а не в потоке вызывающего.Это важное различие, потому что, если V будет изменено или прекратит свое существование к тому времени, когда начнется поток, вы получите другой вектор или неопределенное поведение.

t3:

Это не должно компилироваться, так как поток переместит вектор в ссылку LValue, которая должна быть недопустимой.

t4:

Это проходитвектор по ссылке на поток.Любые изменения переданной ссылки будут применяться к V.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...