当前位置: 首页 > news >正文

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不直接存放数据&#xff0c…...

「数组」定长滑动窗口|不定长滑动窗口 / 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 社区版

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

浅拷贝和深拷贝(Java 与 JavaScript)

一、Java 浅拷贝和深拷贝 在Java中&#xff0c;浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型&#xff0c;基本数据类型是可以由 CPU 直接操作的类型&#xff0c;无论是深拷贝还是浅拷贝&#xff0c;都是会复制出…...

力扣每日一题 2306.公司命名

做题过程中使用到的java语法&#xff1a; 1.从一个字符串中取出一部分字符串&#xff1a; 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描绘了一个层次化的节点树&#xff0c;每一个节点就是一个html标签&#xff0c;而且每一个节点也是一个DOM对象。 2.操作DOM 2.1.获取DOM对象常用方法 获取DOM对象的常用方法有如下几种&#xff1a; getElementById(…...

vue项目报错: At least one is required in a single file component.的主要原因及解决办法

本篇文章主要讲解 vue项目报错&#xff1a; At least one is required in a single file component.的主要原因及解决办法 作者&#xff1a;任聪聪 日期&#xff1a;2024年9月25日 报文信息&#xff1a; Compiled with problems: ERROR in ./src/xxxx.vue Module Error (from …...

03DSP学习-利用syscfg配置IO

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

web - RequestResponse

##Request&Response 1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。这两个对象在我们使用Servlet的时候有看到&#xff1a; 此时&#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请…...

个人文章汇总

文章模块文章汇总心得&资料 真正优秀的人&#xff0c;更懂得尊重别人 如何用沟通解决80%的工作问题 一个IT青年北漂四年的感悟 史上最污技术解读 操作系统相关 操作系统基础 操作系统&#xff1a;从工厂的角度来理解进程线程操作系统&#xff1a;详述对进程和线程的认识操作…...

Java | Leetcode Java题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; 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开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…...

链表入门(LeetCode题目)

来源&#xff1a;左程云算法 链表的题目我们经常是有思路但是实现起来总有些小问题&#xff0c;所以是准备笔试应多加练习的一类题 206. 反转链表 这道题我们可以新开链表来存&#xff0c;但是如果面试中有这道题&#xff0c;面试官让你优化又该如何呢&#xff1f;所以我们采…...

kibana开启访问登录认证

编辑es配置文件&#xff0c;添加以下内容开启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…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...