Методы классов в потоке
Передача методов класса в поток принципиально не отличается от передачи функций
Для начала создадим класс, содержащий 3 метода (различия в принимаемых и возвращаемых значениях)
class ClassForTest
{
public:
ClassForTest(){}
~ClassForTest(){}
void NoRet_NoArg()
{
cout<<"Task ID="<<this_thread::get_id()<<endl;
for (int var = 0; var < 5; ++var)
{
cout<<"Task is in progress #"<<var<<endl;
this_thread::sleep_for(chrono::milliseconds(100)); //блокирует/переводит текущий поток в режим ожидания на 100мс
}
}
void NoRet_YesArg(int a)
{
cout<<"Task ID="<<this_thread::get_id()<<endl;
for (int var = 0; var < 5; ++var)
{
cout<<"Task is in progress #"<<var<<" a="<<a<<endl;
this_thread::sleep_for(chrono::milliseconds(200)); //блокирует/переводит текущий поток в режим ожидания на 200мс
}
}
int YesRet_YesArg(int a)
{
cout<<"Task ID="<<this_thread::get_id()<<endl;
for (int var = 0; var < 5; ++var)
{
cout<<"Task is in progress #"<<var<<" a="<<a<<endl;
this_thread::sleep_for(chrono::milliseconds(300)); //блокирует/переводит текущий поток в режим ожидания на 300мс
}
return a;
}
};
Для передачи в поток метода класса, возвращающего значения (принимать значения не обязательно, но для возврата нужна обертка в виде лямбда-функции) нужно использовать лямбда-функции
В функции main напишем:
int main()
{
ClassForTest c_Test;
int result;
thread task([&]()
{
result=c_Test.YesRet_YesArg(10);
});
cout<<"Main ID="<<this_thread::get_id()<<endl;
for (int var = 0; var < 5; ++var)
{
cout<<"Main task is in progress #"<<var<<endl;
this_thread::sleep_for(chrono::milliseconds(400)); //блокирует/переводит текущий поток в режим ожидания на 400мс
}
task.join();
cout<<"Output a="<<result<<endl;
return 0;
}
Для передачи в поток метода класса, не принимающего и не возвращающего значения можно использовать следующий синтаксис:
thread task(&Class::Method, Object_of_Class);
int main()
{
ClassForTest c_Test;
thread task(&ClassForTest::NoRet_NoArg, c_Test);
cout<<"Main ID="<<this_thread::get_id()<<endl;
for (int var = 0; var < 5; ++var)
{
cout<<"Main task is in progress #"<<var<<endl;
this_thread::sleep_for(chrono::milliseconds(400)); //блокирует/переводит текущий поток в режим ожидания на 400мс
}
task.join();
return 0;
}
Для передачи в поток метода класса, не принимающего и не возвращающего значения можно использовать следующий синтаксис:
thread task(&Class::Method, Object_of_Class, arguments);
int main()
{
//Sleep(2000);
ClassForTest c_Test;
thread task(&ClassForTest::NoRet_YesArg, c_Test,7);
cout<<"Main ID="<<this_thread::get_id()<<endl;
for (int var = 0; var < 5; ++var)
{
cout<<"Main task is in progress #"<<var<<endl;
this_thread::sleep_for(chrono::milliseconds(400)); //блокирует/переводит текущий поток в режим ожидания на 400мс
}
task.join();
return 0;
}
Примечание: в данных примерах потоки обращаются к общему ресурсу (консоли) без разграничения — поэтому м.б. наложения (описаны в теме 00).