Сообщение - от 04.05.2021 19:38
Изменено 21.07.2025 22:41 AGalilov
Кооперативная / добровольная многозадачность в C++ "на коленке"
В связи с затяжными праздниками решил забавы ради взять в руки 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
И ответ на вопрос "нафига?": а просто интересно.
-
-