现代 C++20 实战高手课
卢誉声
Autodesk 首席工程师
3781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
现代 C++20 实战高手课
15
15
1.0x
00:00/00:00
登录|注册

期中周|期中测试题,你做对了么?

你好,我是卢誉声。
为了帮助你巩固知识,提升能力,期中周我给你出了一道实战题目,基于课程里的代码扩展现有协程框架,实现高级任务调度。题目描述你可以通过这个链接回顾。
这一讲,我会把参考代码和解题思路公布出来。

答案解析

既然要在现有代码上增加功能,我们就有必要先熟悉原有架构,再决定在哪个模块或哪个层面上追加功能。
通过分析,可以发现任务的执行与调度是通过 asyncpp.task 模块实现的。同时,我们又是在为现有框架提供高优先级调度的能力。因此,新增的模块应该是供 asyncpp.task 使用的。
基于这样的考虑,我们在原有的架构基础上,追加了一个 high performance(asyncpp.hp)模块,供 asyncpp.task 模块实现高性能的线程调度。补充后的架构图是后面这样。
从图中可以看到,asyncpp.task 模块引用了 asyncpp.hp 模块。新的模块提供了高优先级线程调度和管理的能力。
我们来看一下具体实现。首先是:task 子模块。
export module asyncpp.hp:task;
import asyncpp.core;
import <functional>;
import <vector>;
import <mutex>;
namespace asyncpp::hp {
export struct AsyncHpTask {
using ResumeHandler = std::function<void()>;
using TaskHandler = std::function<void()>;
// 协程唤醒函数
ResumeHandler resumeHandler;
// 计算任务函数
TaskHandler taskHandler;
};
export class AsyncHpTaskQueue {
public:
static AsyncHpTaskQueue& getInstance();
void enqueue(const AsyncHpTask& item) {
std::lock_guard<std::mutex> guard(_queueMutex);
_queue.push_back(item);
}
bool dequeue(AsyncHpTask* item) {
std::lock_guard<std::mutex> guard(_queueMutex);
if (_queue.size() == 0) {
return false;
}
*item = _queue.back();
_queue.pop_back();
return true;
}
size_t getSize() const {
return _queue.size();
}
private:
// 高性能计算任务队列
std::vector<AsyncHpTask> _queue;
// 高性能计算任务队列互斥锁,用于实现线程同步,确保队列操作的线程安全
std::mutex _queueMutex;
};
AsyncHpTaskQueue& AsyncHpTaskQueue::getInstance() {
static AsyncHpTaskQueue queue;
return queue;
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了一道期中测试题的答案解析,题目要求基于课程里的代码扩展现有协程框架,实现高级任务调度。作者首先分析了原有架构,确定了新增模块应该是供asyncpp.task使用的。然后详细介绍了新增的高性能计算任务队列模块和任务循环模块的实现,包括使用jthread和设置线程优先级等技术。最后,作者展示了在asyncpp.task:asyncify中使用新的模块,实现了类似之前的asyncify工具,用于将一个普通的函数转换成一个返回Awaitable对象的函数。整体来看,本文涉及了C++编程中的高级任务调度和线程优先级设置等技术,对于想要深入学习C++编程的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++20 实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • Family mission
    感觉asyncpp.task:asyncify 模块中36行使用单例模式构造AsyncHpTaskQueue而不是AsyncTaskQueue::getInstance(),写错了吧

    作者回复: 这部分应该是没问题的, 36行是defaultAsyncAwaitableSuspend,也就是非高性能任务的业务逻辑,所以调用的是AsyncTaskQueue::getInstance 60行是hpAsyncAwaitableSuspend,也就是高性能任务的业务逻辑,所以调用的是asyncpp::hp::AsyncHpTaskQueue::getInstance

    2023-12-12归属地:上海
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部