03. Методы классов в потоке

Методы классов в потоке

Передача методов класса в поток принципиально не отличается от передачи функций

Для начала создадим класс, содержащий 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).

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

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