windows C++ - 任务计划程序(并发运行时)
如果希望微调并发运行时的现有代码的性能,则任务计划程序会很有用。
无法从通用 Windows 平台 (UWP) 应用获取任务计划程序。
在 Visual Studio 2015 及更高版本中,concurrency::task 类和 ppltasks.h 中的相关类型使用 Windows 线程池作为其计划程序。 本主题不再适用于在 ppltasks.h 中定义的类型。 并行算法(例如 parallel_for)继续使用并发运行时作为默认计划程序。
并发运行时提供了一个默认计划程序,因此无需在应用程序中创建一个。 由于任务计划程序有助于优化应用程序的性能,如果你刚开始接触并发运行时,建议从使用并行模式库 (PPL) 或异步代理库开始。
任务计划程序在运行时计划和协调任务。 任务是指执行特定作业的工作单元。 任务通常可以与其他任务并行运行。 任务组项、并行算法和异步代理所执行的工作都属于任务示例。
任务计划程序可以管理关于在具有多个计算资源的计算机上高效执行计划任务的详细信息。 任务计划程序还使用基础操作系统的最新功能。 因此,使用并发运行时的应用程序会自动缩放,并提高具有扩展功能的硬件性能。
与其他并发模型进行比较介绍了抢先式和协作式计划机制之间的差异。 任务计划程序将操作系统的抢先式计划程序与协作式计划和工作窃取算法配合使用,以达到处理资源的最大使用率。
并发运行时提供了默认计划程序,因此你无需管理基础结构详细信息。 因此,通常不会直接使用任务计划程序。 但是,为了满足应用程序的质量要求,你可以使用任务计划程序提供自己的计划策略或将计划程序与特定任务相关联。 例如,假设你有一个作用范围不超过四个处理器的并行排序例程。 你可以使用计划程序策略来创建可生成不超过四个并发任务的计划程序。 通过在此计划程序上运行排序例程,可使其他活动计划程序使用剩余的任何处理资源。
计划程序实例
下面介绍了并发运行时中计划程序实例的作用,以及如何使用 concurrency::Scheduler 和 concurrency::CurrentScheduler 类创建和管理计划程序实例。 当你希望将显式计划策略与特定类型的工作负载相关联时,计划程序实例非常有用。 例如,你可以创建一个计划程序实例来以提升的线程优先级运行一些任务,并使用默认计划程序以普通线程优先级运行其他任务。
并发运行时提供了一个默认计划程序,因此无需在应用程序中创建一个。 由于任务计划程序有助于优化应用程序的性能,如果你刚开始接触并发运行时,建议从使用并行模式库 (PPL) 或异步代理库开始。
计划程序和 CurrentScheduler 类
任务计划程序使应用程序能够使用一个或多个计划程序实例来计划工作。 concurrency::Scheduler 类表示计划程序实例,并封装与计划任务相关的功能。
附加到计划程序的线程称为执行上下文(或只是上下文)。 在任何时候都可以有一个计划程序在当前上下文中处于活动状态。 活动计划程序也称为“当前计划程序”。 并发运行时使用 concurrency::CurrentScheduler 类提供对当前计划程序的访问。 一个上下文的当前计划程序可能与另一个上下文的当前计划程序不同。 运行时不提供当前计划程序的进程级表示形式。
通常,CurrentScheduler 类用于处理当前计划程序。 当你需要管理一个不是当前计划程序的计划程序时,Scheduler 类非常有用。
创建计划程序实例
创建 Scheduler 对象的方法有三种:
- 如果不存在计划程序,运行时会在你使用运行时功能(例如并行算法)执行工作时,为你创建默认计划程序。 默认计划程序将成为启动并行工作的上下文的当前计划程序;
- concurrency::CurrentScheduler::Create 方法将创建一个使用特定策略的 Scheduler 对象,并将该计划程序与当前上下文相关联;
- concurrency::Scheduler::Create 方法可创建一个使用特定策略的 Scheduler 对象,但不将其与当前上下文相关联;
允许运行时创建默认计划程序后,所有并发任务就可以共享同一计划程序。 通常,并行模式库 (PPL) 或异步代理库提供的功能可用于执行并行工作。 因此,无需直接使用计划程序来控制其策略或生存期。 当你使用 PPL 或代理库时,运行时会创建默认计划程序(如果它不存在),并使它成为每个上下文的当前计划程序。 当你创建计划程序并将其设置为当前计划程序后,运行时会使用该计划程序来计划任务。 只有当你需要特定的计划策略时,才能创建额外的计划程序实例。
管理计划程序实例的生存期
运行时使用引用计数机制来控制 Scheduler 对象的生存期。
当你使用 CurrentScheduler::Create 方法或 Scheduler::Create 方法创建 Scheduler 对象时,运行时将该计划程序的初始引用计数值设置为一。 当你调用 concurrency::Scheduler::Attach 方法时,运行时会递增引用计数值。 Scheduler::Attach 方法将 Scheduler 对象与当前上下文相关联。 这将使它成为当前计划程序。 当你调用 CurrentScheduler::Create 方法时,运行时将创建 Scheduler 对象并将其附加到当前上下文(并将引用计数值设置为一)。 你还可以使用 concurrency::Scheduler::Reference 方法来递增 Scheduler 对象的引用计数值。
当你调用 concurrency::CurrentScheduler::Detach 方法以分离当前计划程序,或者调用 concurrency::Scheduler::Release 方法时,运行时会递减引用计数值。 当引用计数值达到零时,运行时会在所有计划任务完成后销毁 Scheduler 对象。 一个正在运行的任务被允许递增当前计划程序的引用计数值。 因此,如果引用计数值达到零,并且有一个任务递增了引用计数值,则在引用计数值再次达到零且所有任务完成之前,运行时不会销毁 Scheduler 对象。
运行时为每个上下文维护一个 Scheduler 对象的内部堆栈。 当你调用 Scheduler::Attach 或 CurrentScheduler::Create 方法时,运行时会将该 Scheduler 对象推送到当前上下文的堆栈中。 这将使它成为当前计划程序。 当你调用 CurrentScheduler::Detach 时,运行时会从堆栈中弹出当前上下文的当前计划程序,并将上一个计划程序设置为当前计划程序。
运行时提供了几种方式来管理计划程序实例的生存期。 下表显示了针对创建计划程序或将计划程序附加到当前上下文的每个方法从当前上下文中释放或分离计划程序的适当方法。
调用不适当的释放或分离方法会在运行时产生不明确的行为。
当你使用的功能(例如 PPL)导致运行时为你创建默认计划程序时,请不要释放或分离此计划程序。 运行时会管理它所创建的任何计划程序的生存期。
由于在所有任务完成之前,运行时不会销毁 Scheduler 对象,你可以使用 concurrency::Scheduler::RegisterShutdownEvent 方法或 concurrency::CurrentScheduler::RegisterShutdownEvent 方法在 Scheduler 对象被销毁时收到通知。 在你必须等待 Scheduler 对象计划的每个任务完成的情况下,这非常有用。
方法和功能
本部分总结了 CurrentScheduler 和 Scheduler 类的重要方法。
将 CurrentScheduler 类视为创建计划程序以用于当前上下文的帮助程序。 Scheduler 类可以让你控制属于另一个上下文的计划程序。
下表显示了 CurrentScheduler 类定义的重要方法。
下表显示了 Scheduler 类定义的重要方法。
相关文章:

windows C++ - 任务计划程序(并发运行时)
如果希望微调并发运行时的现有代码的性能,则任务计划程序会很有用。 无法从通用 Windows 平台 (UWP) 应用获取任务计划程序。 在 Visual Studio 2015 及更高版本中,concurrency::task 类和 ppltasks.h 中的相关类型使用 Windows 线程池作为其计划程序。…...
多米诺骨牌(模拟)
初始化数据结构: 使用一个布尔数组 arr 来表示每个位置是否被占用。初始时所有位置均为 false(未占用)。使用一个 LinkedHashMap(命名为 queue)来记录最近的 R 操作的位置。这个结构可以保持插入顺序,方便后…...
Unity DOTS系列之Struct Change核心机制分析
最近DOTS发布了正式的版本, 我们来分享一下DOTS里面Struct Change机制,方便大家上手学习掌握Unity DOTS开发。 基于ArchType与Chunk的Entity管理机制 我们回顾以下ECS的内存管理核心机制,基于ArchTypeChunk的Entity管理模式。每个Entity不直接存放数据,…...
「数组」定长滑动窗口|不定长滑动窗口 / LeetCode 2461|2958(C++)
目录 概述 1.定长滑动窗口 思路 复杂度 Code 2.不定长滑动窗口 思路 复杂度 Code 总结 概述 在双指针合集中,我们介绍了双指针算法: 「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11&#…...

【华为】用策略路由解决双出口运营商问题
需求描述 不同网段访问互联网资源时,走不同的出口,即PC1走电信出口,PC2走移动出口。 客户在内网接口下应用策略路由后往往出现无法访问内网管理地址的现象,该举例给出解决办法。 拓扑图 基础配置 #sysname R1 # # interface G…...

第L2周:机器学习|线性回归模型 LinearRegression:1. 简单线性回归模型
本文为🔗365天深度学习训练营 中的学习记录博客原作者:K同学啊 任务: ●1. 通过本文学习LinearRegression简单线形回归模型。 ●2. 模仿本文代码,通过鸢尾花花瓣长度预测花瓣宽度。 一、概念 什么是回归 回归的目的是为了预测&…...

1.5 测试用例
欢迎大家订阅【软件测试】 专栏,开启你的软件测试学习之旅! 文章目录 前言1 测试用例介绍2 测试用例编写3 案例分析 前言 测试用例的设计和编制是软件活动中最重要的工作。本文详细讲解了测试用例的基本概念以及如何编写测试用例。 本篇文章参考黑马程序…...
P1101 单词方阵
1. 题目链接P1101 单词方阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc.h> using namespace std; #define endl \n #define int long long int int xx[] {1,1,1,0,0,-1,-1,-1}; int yy[] {1,0,-1,1,-1,1,0,-1}; int vis[110][110]; char a[11…...

通过 OBD Demo 体验 OceanBase 4.3 社区版
本文作者:马顺华 引言 OceanBase 4.3 是一个专为实时分析 AP 业务设计的重大更新版本。它基于LSM-Tree架构,引入了列存引擎,实现了行存与列存数据存储的无缝整合。这一版本不仅显著提升了AP场景的查询性能,同时也确保了TP业务场景…...

浅拷贝和深拷贝(Java 与 JavaScript)
一、Java 浅拷贝和深拷贝 在Java中,浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型,基本数据类型是可以由 CPU 直接操作的类型,无论是深拷贝还是浅拷贝,都是会复制出…...
力扣每日一题 2306.公司命名
做题过程中使用到的java语法: 1.从一个字符串中取出一部分字符串: String str "Hello, World!"; String part str.substring(7); // 从索引7开始到字符串末尾 System.out.println(part); // 输出: World! class Solution { public lo…...

HTML-DOM模型
1.DOM模型 window对象下的document对象就是DOM模型。 DOM描绘了一个层次化的节点树,每一个节点就是一个html标签,而且每一个节点也是一个DOM对象。 2.操作DOM 2.1.获取DOM对象常用方法 获取DOM对象的常用方法有如下几种: getElementById(…...
vue项目报错: At least one is required in a single file component.的主要原因及解决办法
本篇文章主要讲解 vue项目报错: At least one is required in a single file component.的主要原因及解决办法 作者:任聪聪 日期:2024年9月25日 报文信息: Compiled with problems: ERROR in ./src/xxxx.vue Module Error (from …...

03DSP学习-利用syscfg配置IO
上一篇博客介绍了syscfg,对syscfg有了初步的了解,但是在真正使用上它之前,还不能理解他是一个神器。 (在写博客的时候,我是在从头到尾重新完成这个步骤,希望对初学者有点帮助) 找到Board Component 打开syscfg文件&…...

web - RequestResponse
##Request&Response 1,Request和Response的概述 Request是请求对象,Response是响应对象。这两个对象在我们使用Servlet的时候有看到: 此时,我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请…...
个人文章汇总
文章模块文章汇总心得&资料 真正优秀的人,更懂得尊重别人 如何用沟通解决80%的工作问题 一个IT青年北漂四年的感悟 史上最污技术解读 操作系统相关 操作系统基础 操作系统:从工厂的角度来理解进程线程操作系统:详述对进程和线程的认识操作…...

Java | Leetcode Java题解之第436题寻找右区间
题目: 题解: class Solution {public int[] findRightInterval(int[][] intervals) {int n intervals.length;int[][] startIntervals new int[n][2];int[][] endIntervals new int[n][2];for (int i 0; i < n; i) {startIntervals[i][0] inter…...
大模型智能体在金融公告理解领域的应用 | OPENAIGC开发者大赛高校组AI创新之星奖
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…...
链表入门(LeetCode题目)
来源:左程云算法 链表的题目我们经常是有思路但是实现起来总有些小问题,所以是准备笔试应多加练习的一类题 206. 反转链表 这道题我们可以新开链表来存,但是如果面试中有这道题,面试官让你优化又该如何呢?所以我们采…...

kibana开启访问登录认证
编辑es配置文件,添加以下内容开启es认证 vim /etc/elasticsearch/elasticsearch.yml http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization xpack.security.enabled: true xpack.security.transport.ssl.enable…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...