Кооперативная / добровольная многозадачность в C++ "на коленке"
От: AGalilov  
Дата: 04.05.21 19:38
Оценка: +1
В связи с затяжными праздниками решил забавы ради взять в руки Visual Studio 2019 и изобразить кооперативную многозадачность. Свой велосипед — самый велосипедный велосипед!



Применить получилось как-то так:

#include <iostream>
#include "TaskManager.h"

void  __stdcall t1(void* data)
{
    std::cout << "Start T1" << std::endl;
    std::cout << static_cast<const char*>(data) << std::endl;
    for (auto i = 0; i < 6; i++)
    {
        std::cout << "In T1 " << i << std::endl;
        yield();
    }
    std::cout << "End T1" << std::endl;
}

void  __stdcall t2(void* data)
{
    std::cout << "Start T2" << std::endl;
    std::cout << static_cast<const char*>(data) << std::endl;
    for (auto i = 0; i < 5; i++)
    {
        std::cout << "In T2 " << i << std::endl;
        yield();
    }
    std::cout << "End T2" << std::endl;
}

void  __stdcall t3(void* data)
{
    std::cout << "Start T3" << std::endl;
    yield();
    std::cout << static_cast<const char*>(data) << std::endl;
    std::cout << "End T3" << std::endl;
}

int main()
{
    // Enqueue tasks
    TaskManager::addTask(t1, (void*)"Hello from task1", "t1");
    TaskManager::addTask(t2, (void*)"Hi there!", "t2");
    TaskManager::addTask(t3, (void*)"Task 3 is here", "t3");
    // run
    TaskManager::start();
    return 0;
}


Вывод

Start T1
Hello from task1
In T1 0
Start T2
Hi there!
In T2 0
Start T3
In T1 1
In T2 1
Task 3 is here
End T3
In T1 2
In T2 2
In T1 3
In T2 3
In T1 4
In T2 4
In T1 5
End T2
End T1


И ответ на вопрос "нафига?": а просто интересно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.