01. Передача параметра в поток по ссылке или указателю

Передача параметра в поток по ссылке или указателю

По умолчанию потоки НЕ работают со ссылками, они используют переменные по значению, что в общем-то логично, т.к. при многопоточности работать с памятью напрямую может быть небезопасно (обращения к одной переменной из разных потоков одновременно), но передать параметр в поток по ссылке можно.

Чтобы передать параметр в поток по ссылке требуется
1- переписать функцию Task2 (из предыдущей темы) на void Task2(string &str)
2-Создать переменную и передать ее, используя функцию ref

string Text="Text";
thread th_2(Task2,std::ref(Text));

По указателю параметр передается и без дополнительной функции, т.к. по сути мы передаем лишь адреса и работаем напрямую.

void Task2(string *str)
{
    cout<<"Task_1 ID="<<this_thread::get_id()<<endl;
    for (int var = 0; var < 10; ++var)
    {
        cout<<" >>Task #2 is in progress. Print "<<*str<<" #"<<var<<endl;
        this_thread::sleep_for(chrono::milliseconds(200)); //блокирует/переводит текущий поток в режим ожидания на 200мс
    }

    *str="changed text";
}

в main напишем:

thread th_2(Task2,&Text);

th_2.join();
cout<<Text<<endl;
return 0;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *