期中周 扩展现有协程框架,实现高级任务调度
你好,我是卢誉声。
时间过得真快,从 1 月 16 日上线到现在,我们的学习之旅已经走过了将近1个月,不知道你的收获如何呢?
之前我说过,如何在实际工程项目中通过C++20的新特性解决问题,将是我们学习的重点。从我的经验看,想要从初步了解到熟练应用这些新特性,也确实需要多花些功夫,而且不光要多看,更要多练,这样才能形成“手感”。
所以,我特意安排了这次期中周。从 2 月 13 日开始到 2 月 19 日结束,这期间我们会暂停更新正文内容,你可以好好利用这一周的时间,回顾一下前面学过的知识,查漏补缺。
在实际工作里,新的挑战通常是我们学习锻炼的良机。所以,期中周我还给你准备了一道测试题,一起来挑战一下吧!
C++ Coroutines是C++20标准带来的最令人兴奋和激动的全新核心语言特性之一。课程第七讲至第十讲,用了不少篇幅详细讲解C++ Coroutines。不过,正如我们所见的,C++20中提供的协程仅提供了语言层面的支持,缺乏标准库的支持。因此,在标准得到进一步演化之前,我们不得不实现绝大多数接口约定。
这让我们使用C++ Coroutines的成本提高了。我在课程中已经给出了基于接口约定的实战案例。但是,这个案例还有不少可以提升的空间。请你在现有代码的基础上,尝试实现后面的功能。
现有代码地址:https://github.com/samblg/cpp20-plus-indepth/tree/main/09_and_10/Asyncpp
首先,在Windows上,通过 CMake 编译出课程里提供的 asyncpp 代码。
在目前的设计中,只支持简单的、耗时较短的异步I/O任务。那么,当遇到耗时的异步计算时,我们还是需要一种更智能的任务分发机制来处理耗时任务。
所以要实现的功能就是:请你使用专有线程、线程优先级来处理这种特殊情况。具体包括两个方面。
首先,通过参数,判断一个异步函数是否需要通过高优先级的线程上执行。
另外,请你使用std::thread::native_handle,实现在Windows系统上的优先级线程调度。
实时设置线程优先级的示例代码是后面这样。
#include <iostream>
#include <thread>
#include <chrono>
#include <cstdint>
#include <string>
#include <Windows.h>
void simpleSleep() {
using namespace std::literals::chrono_literals;
std::cout << "[SIMPLE] Before simple sleep" << std::endl;
std::this_thread::sleep_for(2000ms);
std::cout << "[SIMPLE] After simple sleep" << std::endl;
}
int main() {
std::cout << "[MAIN] Before create simple thread" << std::endl;
std::thread simpleWorker(simpleSleep);
// 获取native handle
auto nativeWorkerHandle = simpleWorker.native_handle();
// 设置线程优先级
std::cout << "THREAD_PRIORITY_HIGHEST: " << THREAD_PRIORITY_HIGHEST << std::endl;
::SetThreadPriority(nativeWorkerHandle, THREAD_PRIORITY_HIGHEST);
std::cout << "Thread Priority: " << ::GetThreadPriority(nativeWorkerHandle) << std::endl;
simpleWorker.join();
std::cout << "[MAIN] Main function exited" << std::endl;
return 0;
}
你可以考虑使用以下开发环境和工具。
- Windows 10 或更高
- Visual Studio 2022: https://visualstudio.microsoft.com/zh-hans/vs/
- CMake 3.16 或更高:https://cmake.org/download/
期待你的作业!
- 李云龙 👍(1) 💬(1)
由于不能上传图片,我就描述一下我的思路:我在老师的代码基础上增加了一个Awaitable类型,用于专门处理有优先级的任务。同样地,我也增加了一个处理高优先级任务的任务队列、一个专门处理高优先级任务的任务循环的异步线程。需要高优先级任务处理的任务首先需要使用AsyncifyPriority转换为新增的AwaitablePriority类型,这个类型中使用一个可以处理任务优先级的suspender函数,将高优先级任务插入到高优先级任务队列中,将其他优先级任务插入到原有的任务队列中,并将协程唤醒的函数对象都放入主线程的任务队列中。 具体的代码请查阅:https://gitee.com/devin21/midTermAssignment/tree/master/ 欢迎大家批评指正。
2024-01-05 - peter 👍(0) 💬(1)
准备搭建环境试试编译代码: Q1:老师给出的链接中,VS22有三个版本:community、Professional、Enterprise。Community估计是最低版本了,能满足需要吗? Q2:VS22自身没有CMake吗?如果有,为什么老师又提供了一个CMake的链接?(需要下载此CMake,然后安装到VS22吗?) Q3:记得有VS2015,盗版的,不记得放在哪里了,也许可以找到。VS2015或VS2018可以吗?
2023-02-13