模块契约任务与任务池

数据所有权

xtaskargs.Destroy 描述任务数据在受理后的析构方式:

  • 任一种提交函数成功后,执行器取得数据所有权;执行、跳过或取消后恰好析构一次。
  • 提交因 OOM、队列已满、等待超时、等待取消或任务池关闭而失败时,调用方仍持有数据,析构过程不会执行。
  • 数据析构发生在任务过程返回后、Future 终态发布前,因此观察到终态时任务上下文已经完成回收。结果若借用任务数据,不能同时配置数据析构;需要长期保存时应把结果所有权转移给 Future。

xtaskargs.Cancel 是可空父令牌。任务使用自己的子令牌,因此任务取消不会反向取消父作用域,而父取消会传播到任务。

裁剪与依赖

  • XRT_FEATURE_TASK:任务过程、显式结果和内部执行生命周期,依赖 Future 与临时内存。
  • XRT_FEATURE_TASK_GROUP:结构化 Future 作用域、嵌套组与结果统计,只依赖 Future。
  • XRT_FEATURE_TASK_POOL:有界原生线程池,依赖任务核心与线程。
  • XRT_FEATURE_TASK_GROUP_POOL:任务组与有界任务池的原子提交便利层,只在两者同时启用时引入。
  • XRT_FEATURE_TASK_COROUTINE:协程调度任务,依赖任务核心与协程调度器。
  • XRT_FEATURE_TASK_GROUP_COROUTINE:任务组与协程任务的原子提交便利层。
  • XRT_FEATURE_TASK_NET:Engine 亲和任务与延迟任务,依赖任务核心和网络 Engine。
  • XRT_FEATURE_TASK_GROUP_NET:任务组与网络任务的原子提交便利层。

只使用 Future/Promise 时不需要引入任务池;网络引擎、协程调度器和用户执行器也可以复用任务核心,而不依赖线程池。

任务结果

xtaskproc 接收借用的 xcancel、用户数据和预先清零的 xtaskvalue,并显式返回 xtaskoutcome:

  • XTASK_SUCCESS:Future 进入 XFUTURE_RESOLVED。
  • XTASK_FAILED:Future 进入 XFUTURE_FAILED,保存当前结构化错误;没有错误时运行库使用 XERR_INTERNAL。
  • XTASK_CANCELLED:Future 进入 XFUTURE_CANCELLED。

成功值默认是借用值。设置 xtaskvalue.Destroy 后,值和析构过程转移给 Future,并在最后一个 Future 引用释放时销毁。失败、取消或完成冲突时,尚未转移的 owned 值由任务运行库销毁。

任务过程返回值是最终结果。取消请求只表示协作意图:过程观察并处理取消后仍可明确返回成功;只有返回 XTASK_CANCELLED 或执行前已经取消时,Future 才进入取消终态。

执行上下文

每个任务绑定独立的错误上下文和临时 arena:

  • 前一个任务遗留的错误不会污染后一个任务。
  • xrtTempCurrent 和 xrtTemp 只在当前任务生命周期内有效。
  • 任务返回后,临时内存整体释放,不能作为 Future 结果返回。
  • 任务数据析构也在该隔离上下文内执行。

结构化任务组

xtaskgroup 可以跟踪任务 Future、网络 Future 或用户 Promise,不要求源来自某一种执行器。它只为当前活动项保留一个监听节点和源引用,项进入终态后立即摘除并释放,因此内存占用与并发量相关,不随历史任务总数增长。

已有 Future 使用 xrtTaskGroupAdd。需要先启动异步操作再返回 Future 时,使用 xrtTaskGroupStart 和同步启动器 xtaskgroupstartproc:运行库先预留活动槽位,预留成功后才调用启动器,随后把返回的 Future 提交到同一槽位。关闭、活动上限、预留 OOM 或启动失败都不会留下已经启动却未登记的操作;关闭和取消发生在启动器执行期间时,组 Done Future 会等待预留完成,取消还会在 Future 提交后补发。

生命周期语义保持单一口径:

  • xrtTaskGroupClose 停止接纳新项,让当前项自然结束;重复关闭返回 false。
  • xrtTaskGroupCancel 同时关闭组,并向当前项发出协作取消请求;源生产端仍决定各自最终状态。
  • xrtTaskGroupFuture 返回稳定的 Done Future。只有组已关闭且活动项归零时,它才成功完成;子项失败不会被冒充为 Done Future 自身失败。
  • xrtTaskGroupWait、xrtTaskGroupWaitFor、xrtTaskGroupWaitFor 和 xrtTaskGroupWaitForCancel 会先关闭组,再复用 Future 的统一等待语义。
  • xrtTaskGroupCancelToken 返回组取消令牌的新增引用,调用方负责释放。
  • xrtTaskGroupDestroy 会关闭并取消仍活动的项,但不伪造完成;活动监听持有内部引用,允许源稍后安全确认终态并完成延迟回收。

xtaskgroupconfig.Limit 是活动项硬上限,达到上限时 Add 返回 XERR_AGAIN;完成项立即释放槽位。CancelOn 可以组合 XRT_TASK_GROUP_CANCEL_ON_FAILED、XRT_TASK_GROUP_CANCEL_ON_CANCELLED 和 XRT_TASK_GROUP_CANCEL_ON_CLOSED,在指定异常出现后关闭组并取消仍活动的兄弟项。XRT_TASK_GROUP_CANCEL_ON_STOPPED 表示三者合集。默认值为零,即收集全部结果而不自动取消。

xrtTaskGroupChild 创建由父组跟踪的嵌套作用域。父 Close 只关闭子组并等待叶任务自然结束;父 Cancel 才向子组和叶任务传播取消。这样正常作用域退出与异常停止不会混为同一行为。

xrtTaskGroupGet 把活动数、受理数、完成数、成功/失败/取消/关闭数、拒绝数和首个非成功槽位写入 xtaskgroupstats。xrtTaskGroupError 借用首个失败项的结构化错误。组排空后满足:

有界任务池

xrtTaskPoolCreate 接受可空配置。全零字段分别表示逻辑处理器数量、XRT_TASK_POOL_QUEUE_LIMIT_DEFAULT 指定的默认队列上限 1024 和平台默认线程栈。线程数最大值由 XRT_TASK_POOL_THREAD_LIMIT 指定,当前为 256。

队列上限只统计尚未开始运行的任务。达到上限时提交会先回收已经请求取消的排队任务;仍无可用槽位时,调用方可以选择立即返回或等待背压解除:

  • xrtTaskSubmit:立即尝试,队列已满时返回空并设置 XERR_AGAIN。
  • xrtTaskSubmitWait:一直等待槽位。
  • xrtTaskSubmitFor:在相对毫秒数内等待槽位。
  • xrtTaskSubmitFor:等待到指定单调时钟截止时间。
  • xrtTaskSubmitForCancel:同时等待槽位、截止时间或调用方取消。

槽位已经可用时,受理成功优先于同时到达的超时或等待取消。等待调用尚未受理任务时,超时设置 XERR_TIMEOUT,调用方取消设置 XERR_CANCELLED,任务池关闭设置 XERR_CLOSED。关闭和整体取消都会唤醒全部容量等待者。

xrtTaskSubmitForCancel 的取消令牌只约束当前容量等待,不会成为任务的父令牌,也不会取消已经受理的任务。任务执行期取消必须通过 xtaskargs.Cancel 或 xrtFutureCancel 表达。任务池工作线程可以在槽位立即可用时提交到所属池,但队列已满时不得等待自身释放槽位,运行库返回 XERR_STATE,从契约上阻止自锁。

生命周期分为:

  • 打开:接收任务。
  • xrtTaskPoolClose:停止接收普通任务,排空已受理任务;工作线程保持休眠,继续服务运行库已经接管资源的 finalizer。
  • xrtTaskPoolCancel:停止接收普通任务,取消排队任务,并向运行任务发出协作取消请求;资源回收过程不会被取消。
  • xrtTaskPoolDestroy:等待普通任务和资源回收过程全部结束,再终止工作线程并释放任务池。

xrtTaskPoolWait、xrtTaskPoolWaitFor、xrtTaskPoolWaitFor 和 xrtTaskPoolWaitForCancel 只接受已经关闭的池。xrtTaskPoolWaitForCancel 的令牌只中止调用方等待,不改变池或池内任务状态;池已经排空时完成优先于同时到达的超时或取消。任务池自己的工作线程不能等待或销毁所属池,否则返回 XERR_STATE。xrtTaskPoolDestroy 默认关闭并自然排空;需要快速停止时先调用 xrtTaskPoolCancel。

内部资源回收通道只接收已经由运行库受理的资源,节点嵌入资源对象,不发生投递分配,也不占用 QueueLimit。它不是第二条用户任务队列,公共代码不能用它绕过背压。

销毁期间,调用方必须保证没有其他线程继续调用该任务池,并且所有绑定该池的异步资源都已经进入关闭流程。Future 生命周期独立于任务池,池销毁后,调用方已经持有的 Future 仍然有效。

任务组与任务池

XRT_FEATURE_TASK_GROUP_POOL 提供原子组合入口,避免先调用任务池、再调用 xrtTaskGroupAdd 时在两步之间关闭任务组:

  • xrtTaskGroupSubmit:立即尝试任务池提交。
  • xrtTaskGroupSubmitWait:永久等待任务池槽位。
  • xrtTaskGroupSubmitFor:在相对毫秒数内等待。
  • xrtTaskGroupSubmitFor:等待到单调时钟截止时间。
  • xrtTaskGroupSubmitForCancel:再叠加调用方取消。

可等待版本会自动把组取消合并到容量等待。组在任务尚未受理时取消,提交返回 XERR_CANCELLED、组预留回滚且数据仍归调用方;任务已经受理时,Future 正常纳入组并收到协作取消请求。正常 Close 不取消容量等待,因为 Close 的含义是停止新增预留并自然等待已经预留的操作。

协程任务

xrtTaskCo 把同一个 xtaskproc 提交到指定协程调度器;调度器为空时使用当前协程所属调度器。显式指定调度器时可以从任意线程提交,内部先进入调度器 FIFO post 队列,再由所属线程创建协程。调用发生在普通执行路径且没有显式调度器时返回 XERR_STATE。

协程任务使用分离协程,用户只持有 Future。Future 的取消令牌是协程取消令牌的父级,因此取消 Future 会唤醒正在 park、sleep 或 await 的任务协程。首次调度前取消不会进入任务过程,但协程终结过程仍会把 Future 完成为取消并释放受理后的任务数据。

任务过程的显式结果优先于取消请求:过程从取消等待恢复后仍可返回 XTASK_SUCCESS,此时 Future 成功;返回 XTASK_CANCELLED 时 Future 才是取消终态。协程栈大小为零时使用协程默认值。

提交成功表示调度器已经受理任务数据和 Future 生命周期,不表示协程已经创建。调度器在处理该投递前关闭时,Future 以 XERR_CLOSED 失败并析构受理的数据;关闭后直接提交返回空、设置 XERR_CLOSED,数据所有权仍归调用方。

XRT_FEATURE_TASK_GROUP_COROUTINE 提供 xrtTaskGroupCo,在任务组预留窗口中调用 xrtTaskCo。组已经关闭时不会触碰调度器或任务数据;提交与组取消竞争时,成功受理的 Future 会先登记,再收到取消请求。

网络 Engine 任务

XRT_FEATURE_TASK_NET 是任务体系到网络 Engine 的可选桥,不会让 Future、Task 或 TaskGroup 核心反向依赖网络。xtasknetproc 在普通任务参数之前额外借用亲和 xnetworker,因此过程可以直接访问 Worker 缓冲池和 Engine 上下文;它仍使用相同的 xcancel、xtaskvalue、结构化错误、临时 arena 和数据所有权合同。

  • xrtTaskNet:尽快在指定亲和 Worker 上执行。
  • xrtTaskNetAfter:在相对毫秒数到期后执行。
  • xrtTaskNetFor:在单调时钟截止时间到期后执行。

网络任务运行在事件循环线程,不得执行阻塞系统调用或长时间 CPU 工作;这些工作应 提交到 xtaskpool。立即任务一旦受理,即使 Engine 随后停止也会在排空阶段执行。 延迟任务在 Engine 到期时执行;Future 取消会请求摘除 Timer,确认后以 XFUTURE_CANCELLED 终结。Engine 在截止时间前停止时,任务不进入用户过程,并以 XERR_CLOSED 的结构化错误失败。底层 Timer 完成、取消监听注销和任务数据析构全部 先于 Future 终态发布,因此消费者不会观察到仍被 Worker 使用的任务上下文。

XRT_FEATURE_TASK_GROUP_NET 提供 xrtTaskGroupNet、 xrtTaskGroupNetAfter 和 xrtTaskGroupNetFor。这些函数先预留 TaskGroup 活动槽位, 再提交 Engine 操作;组已关闭、达到活动上限或预留 OOM 时不会启动网络任务,也不会 接管用户数据。组取消会传播到任务 Future,并等待 Timer 的真实取消回调完成。

统计

xrtTaskPoolGet 把一致快照写入 xtaskpoolstats:线程数、队列硬上限、排队数、运行数、受理数、完成数、成功数、失败数、取消数、拒绝数,以及关闭和取消状态。

恒等式在池排空后成立:

拒绝任务不计入 Submitted,只计入 Rejected。

示例

完整示例位于 examples/concurrency/task_group/main.c、examples/concurrency/task_group_scope/main.c、examples/concurrency/task_pool/main.c、examples/concurrency/task_coroutine/main.c、examples/network/task/main.c 和 examples/network/task_group/main.c。task_group_scope 明确演示父级取消、子组传播和叶生产端确认终态之间的边界。

任务结果的显式生命周期策略

xrtTaskSubmitOwnedPolicyV1(pool, proc, data, args, policy) 在原生任务受理前 选择与 Future 共用的不可变结果策略,不改变 xtaskargs/xtaskvalue 布局。 成功返回的拥有结果必须使用该策略的实际 Drop 地址和空 DestroyData;三字段 全空的 void 结果也合法。错误组合在任务数据释放及结果发布之前转为 FAILED, 使用原来的实际释放函数回滚一次,不会把错误载荷认证后交给消费者。

原有 xrtTaskSubmitTraced 的追踪接口保持兼容,但不自动变成回收认证。 新接口认证的是完成后的结果,不是任务帧、执行中的原生作业或等待回调。

原生 Job 的实际拥有关系与准备协议

xrtTaskSubmitOwnedJobV1(pool, data, cancel, dataPolicy, resultPolicy) 同时选择 不可变 xtaskdataownershipv1 和结果策略。数据策略明确 Proc、Drop 与实际 Data 拥有节点的 Ops;受理只接管调用方现有的一次 Data 引用,不额外保留。拒绝时 不运行 Proc、Drop 或 Data 的 Count/Trace,调用方仍负责原数据。描述符和所有 回调必须存活到 Job 的最后一个引用释放,包括检查器持有的引用。

所有任务的 pending Future 现在实际拥有一个原生 Job 引用,执行器另有一个 真实引用。Job 拥有 Promise、取消令牌和受理的数据;借用 Future 指针及队列 链接不重复计为拥有边。普通终态发布释放 Future 的 Job 引用,执行器则在工作、 数据释放、通知和自身清理返回后释放其引用。排队任务仍有执行器外部根,不能 通过修正计数或忽略执行器引用把它当成无根垃圾。

xrtTaskProducerPolicyV1Get() 只标识这条真实的 producer 边,不认证未知 Data。 xrtTaskOwnershipAdapterV1 在独占 freeze 下先匹配调用方允许的数据策略身份, 再检查实际 Proc/Drop/数据布局;旧 Submit、未知策略以及执行或释放中的 Job 仍拒绝生命周期准入,不会先调用其不可信的 Data Count/Trace。

返回的强制 preparation 不取消任务、不摘队列,也不跳过已受理工作。排队或 尚未归还执行器职责的 Job 返回 BUSY;只有正常执行、数据释放、结果发布和 执行器清理完成后才可 READY/Clear。所有用户 Proc/Drop 和普通 Future 通知都 在 ownership mutation/freeze 外执行,Clear/Finish 不重放这些语义职责。

tests/concurrency/test_task_job_ownership.c 及其单头入口覆盖真实四节点/六边 图、执行器/producer/检查器引用、成功/失败/取消/错误载荷、拒绝不消费数据、 分配失败、执行中的前置拒绝和 BUSY/READY。此协议不等于未知任务数据已认证, 也不定义封闭 producer 依赖环的关停策略。

原生任务池的拥有图与 join 边界

xrtTaskPoolOwnership 返回真实任务池的借用视图;Create 的一个 owner 引用、 原生 API 调用期间的引用,以及 adapter Hold 的引用都进入实际计数。Destroy 只消费一次 owner;检查器的引用可以让已 join 的终态外壳继续存活。外壳中的 锁和条件变量直到最后一次实际 Drop 才释放,不把“工作线程已退出”误当作 所有调用者都不再访问池。

xrtTaskPoolOwnershipAdapterV1 要求调用方独占 freeze。全部 worker 必须已经 休眠或退出,原生调用、执行中的 Job、摘除后的取消链、清理尾部以及未建模 的 finalizer 都拒绝检查。worker/control 是池唯一拥有、join 前不可释放的 内部资源,并非独立 RC 节点;休眠不猜减引用,运行中的原生栈也不冒充无根。 Trace 对每个排队 Job 报告一次实际 executor 引用,不重复报告 Tail/Next。 Job 的 Data policy 仍需检查器独立白名单准入;池被认证不等于所有任务被认证。 异步文件从创建到原生关闭及对象清理返回实际持有一个池引用,创建失败也准确 归还。尚未认证的文件不是池的可清理子节点,这个实际引用始终形成外部根; 即使池空闲也不能 Claim/Prepare 为可卸载。不能仅检查 finalizer 队列而漏掉 尚未开始关闭、将来才会投递 finalizer 的资源。

仅在不可达图已被授权 Claim 后,Prepare 才关闭新准入,保留已受理任务的原有 执行、成功/失败/取消和数据清理。它不主动取消、摘取或跳过任务。排空包含 Job 物理释放及 finalizer 尾部;随后通知 worker 退出,在所有锁和 ownership scope 外用零超时 join 检查真正的线程终态。BUSY 不能当作完成。Clear 要求 READY,Finish 只回收已 join 的 worker 资源并可重复调用;原始 owner 仍须由 调用方 Destroy 归还。

已有公开 API 的并发销毁限制不变:调用方必须先停止其他并发访问。额外的 原生 entry 保活保证在 Submit 的同步取消清理中重入 Destroy 时,拒绝发生在 关闭或释放池之前,避免外层 Submit 继续访问已释放的统计字段。内部资源的 finalizer 仍须满足原有 accepted-resource lifetime,不允许向已 join 的池投递。

test_task_pool_ownership.c 的模块化和单头入口覆盖精确队列图、外部根、策略 拒绝、运行/清理中 freeze、真实 join、终态外壳、finalizer、分配失败及准确的 内存数量/字节平衡。test_task_pool_native_entry.c 只使用原有公开 API,可直接 对修正前的池实现复现重入销毁问题。这是原生拥有契约,不宣称语言模块 task pool 接线或 task/callback/native 混合依赖环已经完成。

xtaskoutcome类型

任务过程必须显式说明成功、失败或协作取消,避免依赖残留错误状态。

值语义
XTASK_SUCCESSSUCCESS
XTASK_FAILED已失败
XTASK_CANCELLED已取消
typedef enum xtaskoutcome { XTASK_SUCCESS = 0, XTASK_FAILED = 1, XTASK_CANCELLED = 2 } xtaskoutcome;

xtaskvalue类型

成功结果可以借用值,也可以把值及其析构过程转移给 Future。

字段类型语义
Valueptr值
DestroyxfuturefreeprocDestroy
DestroyDataptrDestroyData
typedef struct xtaskvalue { ptr Value; xfuturefreeproc Destroy; ptr DestroyData; } xtaskvalue;

xtaskargs类型

提交参数控制父取消关系及任务数据在受理后的释放方式。

字段类型语义
Cancelxcancel*取消令牌
DestroyxfuturefreeprocDestroy
DestroyDataptrDestroyData
typedef struct xtaskargs { xcancel* Cancel; xfuturefreeproc Destroy; ptr DestroyData; } xtaskargs;

xtaskgroupconfig类型

全零配置表示不限活动项数量、不自动取消兄弟项且使用独立取消源。

字段类型语义
Cancelxcancel*取消令牌
Limitsize_t上限
CancelOnuint32CancelOn
typedef struct xtaskgroupconfig { xcancel* Cancel; size_t Limit; uint32 CancelOn; } xtaskgroupconfig;

xtaskgroupstats类型

任务组统计保留全部历史终态计数,但只为当前活动项占用节点内存。

字段类型语义
Activesize_tActive
Addeduint64Added
Completeduint64Completed
Succeededuint64Succeeded
Faileduint64Failed
Cancelleduint64Cancelled
Closeduint64Closed
Rejecteduint64Rejected
FirstIndexsize_tFirstIndex
FirstStatexfuturestateFirstState
AcceptingboolAccepting
CancellingboolCancelling
typedef struct xtaskgroupstats { size_t Active; uint64 Added; uint64 Completed; uint64 Succeeded; uint64 Failed; uint64 Cancelled; uint64 Closed; uint64 Rejected; size_t FirstIndex; xfuturestate FirstState; bool Accepting; bool Cancelling; } xtaskgroupstats;

xtaskpoolconfig类型

全零配置使用逻辑处理器数量、默认队列上限和平台默认线程栈。

字段类型语义
Threadsuint32线程数
QueueLimitsize_tQueueLimit
StackSizesize_t栈大小
typedef struct xtaskpoolconfig { uint32 Threads; size_t QueueLimit; size_t StackSize; } xtaskpoolconfig;

xtaskpoolstats类型

统计快照区分瞬时负载、终态分布、拒绝量和生命周期状态。

字段类型语义
Threadsuint32线程数
QueueLimitsize_tQueueLimit
Queuedsize_tQueued
Runningsize_tRunning
Submitteduint64Submitted
Completeduint64Completed
Succeededuint64Succeeded
Faileduint64Failed
Cancelleduint64Cancelled
Rejecteduint64Rejected
ClosedboolClosed
CancellingboolCancelling
typedef struct xtaskpoolstats { uint32 Threads; size_t QueueLimit; size_t Queued; size_t Running; uint64 Submitted; uint64 Completed; uint64 Succeeded; uint64 Failed; uint64 Cancelled; uint64 Rejected; bool Closed; bool Cancelling; } xtaskpoolstats;

xtaskgroup类型

任务组跟踪一组 Future,并在关闭且全部完成后发布唯一 Done Future。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xtaskgroup xtaskgroup;

xtaskpool类型

任务池对外保持不透明;销毁期间调用方必须停止其他并发访问。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xtaskpool xtaskpool;

xtaskproc类型

任务过程借用取消令牌,并把成功值写入预先清零的结果结构。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xtaskoutcome(*xtaskproc)( xcancel* pCancel, ptr pData, xtaskvalue* pResult)

xtaskgroupstartproc类型

Future 启动器同步返回一个新引用,返回空时保留自己的结构化错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xfuture* (*xtaskgroupstartproc)(ptr pData);
结构化任务组

xrtTaskGroupCreate函数

创建结构化任务组;配置为空时使用全零默认值。

xtaskgroup* xrtTaskGroupCreate(const xtaskgroupconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空组配置,空 = 默认
返回值
返回含义失败时状态
非空任务组(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 创建任务组

	pGroup = xrtTaskGroupCreate(&GroupConfig);

xrtTaskGroupChild函数

创建由父组跟踪的子组;父关闭时关闭子组,父取消时取消子组。

xtaskgroup* xrtTaskGroupChild(xtaskgroup* pParent, const xtaskgroupconfig* pConfig)

参数

参数方向约束说明
pParent输入非空父组
pConfig输入允许空组配置,空 = 默认
返回值
返回含义失败时状态
非空子组—
NULL创建失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_group_scope · 创建子组

	pChild = xrtTaskGroupChild(pParent, NULL);

xrtTaskGroupAdd函数

跟踪一个 Future;成功时组保留到该 Future 终态为止的引用。

bool xrtTaskGroupAdd(xtaskgroup* pGroup, xfuture* pFuture)

参数

参数方向约束说明
pGroup输入非空目标任务组
pFuture输入非空要跟踪的 Future
返回值
返回含义失败时状态
true已纳入跟踪—
false失败XERR_ARGUMENT / XERR_CLOSED / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_STATE — 组已进入完成路径

范例已编译验证

task_group_scope · 跟踪 Future

		!xrtTaskGroupAdd(pChild, pLeaf) ) {

xrtTaskGroupStart函数

先预留组槽位,再同步启动并跟踪 Future;失败时不会留下未登记操作。

xfuture* xrtTaskGroupStart(xtaskgroup* pGroup, xtaskgroupstartproc pProc, ptr pData)

参数

参数方向约束说明
pGroup输入非空目标任务组
pProc输入非空启动过程
pData输入任意值过程数据
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 同步启动

			xfuture* pStarted = xrtTaskGroupStart(pGroup,
				exampleStarter, pPool2);

xrtTaskGroupFuture函数

返回增加引用后的 Done Future;它在组关闭且活动项归零时成功完成。

xfuture* xrtTaskGroupFuture(const xtaskgroup* pGroup)

参数

参数方向约束说明
pGroup输入非空目标任务组
返回值
返回含义失败时状态
非空Done Future 新引用,用后释放—
NULL参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

task_group_scope · Done Future

	pDone = xrtTaskGroupFuture(pParent);

xrtTaskGroupClose函数

停止接纳新项,并让当前项及子组自然结束。

bool xrtTaskGroupClose(xtaskgroup* pGroup)

参数

参数方向约束说明
pGroup输入非空目标任务组
返回值
返回含义失败时状态
true已关闭—
false参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 组已销毁

范例已编译验证

task · 关闭

			!xrtTaskGroupClose(pGroup) ||

xrtTaskGroupCancel函数

停止接纳新项,并向当前项及子组发出协作取消请求。

bool xrtTaskGroupCancel(xtaskgroup* pGroup)

参数

参数方向约束说明
pGroup输入非空目标任务组
返回值
返回含义失败时状态
true请求已发出—
false参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 组已销毁

范例已编译验证

task_group_scope · 取消

	if ( !xrtTaskGroupCancel(pParent) ||
		!xrtCancelRequested(pLeafCancel) ||
		!xrtPromiseCancel(pLeafPromise) ||
		(xrtFutureWait(pDone) != XWAIT_OK) ) {

xrtTaskGroupCancelToken函数

返回增加引用后的组取消令牌。

xcancel* xrtTaskGroupCancelToken(const xtaskgroup* pGroup)

参数

参数方向约束说明
pGroup输入非空目标任务组
返回值
返回含义失败时状态
非空取消令牌新引用,用后 xrtCancelDestroy—
NULL参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

task_tour · 组取消令牌

		if ( (xrtTaskGroupCancelToken(pGroup) == NULL) ) {

xrtTaskGroupGet函数

复制当前负载、累计结果、首个异常槽位和生命周期状态。

bool xrtTaskGroupGet(const xtaskgroup* pGroup, xtaskgroupstats* pStats)

参数

参数方向约束说明
pGroup输入非空目标任务组
pStats输出非空接收统计快照
返回值
返回含义失败时状态
true快照已写出—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

task_group_scope · 组统计

		!xrtTaskGroupGet(pParent, &tStats) ) {

xrtTaskGroupError函数

返回首个失败项的借用结构化错误;任务组存活期间保持有效。

const xerror* xrtTaskGroupError(const xtaskgroup* pGroup)

参数

参数方向约束说明
pGroup输入非空目标任务组
返回值
返回含义失败时状态
非空错误借用—
NULL尚无失败项不设错误
错误
  • 尚无失败项返回 NULL 且不设置错误;句柄为空 XERR_ARGUMENT

范例已编译验证

task_tour · 首个异常

		pError = xrtTaskGroupError(pGroup);

xrtTaskGroupWait函数

关闭任务组并等待全部当前项进入终态。

xwaitresult xrtTaskGroupWait(xtaskgroup* pGroup)

参数

参数方向约束说明
pGroup输入非空目标任务组
返回值
返回含义失败时状态
XWAIT_OK全部项进入终态—
XWAIT_TIMEOUT期限或截止时间先到达不设错误
XWAIT_CANCELLED调用方取消触发不设错误
XWAIT_ERROR参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 组已销毁

范例已编译验证

task_group_pool · 关闭并等待

	if ( xrtTaskGroupWait(pGroup) != XWAIT_OK ) {

xrtTaskGroupWaitFor函数

关闭任务组并在相对毫秒数内等待全部当前项。

xwaitresult xrtTaskGroupWaitFor(xtaskgroup* pGroup, int64 iTimeout)

参数

参数方向约束说明
pGroup输入非空目标任务组
iTimeout输入—相对毫秒数
返回值
返回含义失败时状态
XWAIT_OK全部项进入终态—
XWAIT_TIMEOUT期限或截止时间先到达不设错误
XWAIT_CANCELLED调用方取消触发不设错误
XWAIT_ERROR参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 组已销毁

范例已编译验证

task · 关闭并限时等待

			(xrtTaskGroupWaitFor(pGroup, 3000000u) !=
				XWAIT_OK) ) {

xrtTaskGroupWaitForCancel函数

关闭任务组,并等待组完成、截止时间或调用方取消中的首个事件。

xwaitresult xrtTaskGroupWaitForCancel(xtaskgroup* pGroup, int64 iTimeout, xcancel* pCancel)

参数

参数方向约束说明
pGroup输入非空目标任务组
iTimeout输入—单调时钟截止时间
pCancel输入允许空调用方取消令牌
返回值
返回含义失败时状态
XWAIT_OK全部项进入终态—
XWAIT_TIMEOUT期限或截止时间先到达不设错误
XWAIT_CANCELLED调用方取消触发不设错误
XWAIT_ERROR参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 组已销毁

范例已编译验证

task_tour · 关闭并可取消等待

			(xrtTaskGroupWaitForCancel(pGroup,
				EXAMPLE_TIMEOUT_MS,
				pCancel) != XWAIT_OK) ) {

xrtTaskGroupDestroy函数

关闭并取消仍活动的项,随后以延迟回收方式释放任务组。

void xrtTaskGroupDestroy(xtaskgroup* pGroup)

参数

参数方向约束说明
pGroup输入允许空空 = 空操作
返回值
返回含义失败时状态
无已销毁—
错误
  • 无 — 销毁不失败

范例已编译验证

task_tour · 销毁

	xrtTaskGroupDestroy(pGroup);
有界任务池

xrtTaskPoolCreate函数

创建有界工作线程池;配置为空或字段为零时使用对应默认值。

xtaskpool* xrtTaskPoolCreate(const xtaskpoolconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空池配置,空/零字段 = 默认
返回值
返回含义失败时状态
非空任务池—
NULL创建失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 容量或线程数字段越界
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 创建任务池

	pPool = xrtTaskPoolCreate(&PoolConfig);

xrtTaskSubmit函数

提交任务并返回其 Future;失败时任务数据所有权仍属于调用方。

xfuture* xrtTaskSubmit(xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs)

参数

参数方向约束说明
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_AGAIN — 队列已满
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 提交

	return xrtTaskSubmit((xtaskpool*)pData, exampleTask, NULL,
		NULL);

xrtTaskSubmitTraced函数

在立即提交时提供不可变的 xfutureownershiptrace,成功拥有型结果的值、析构、 析构上下文及 Trace 作为一个终态原子发布。Trace 在作业入队前固定,不能通过 先提交、后改结果描述的方式接入。它必须描述 xtaskvalue.Destroy 释放的全部 强拥有槽,包含重复的 Value/DestroyData 引用。Trace 不在任务提交或完成时调用。 resultTrace 必须非空;提交失败不消费任务数据。失败/取消的任务按原合同释放 未发布结果;借用成功值不产生拥有边。现有提交函数和 xtaskargs / xtaskvalue 布局完全不变,旧 owned 结果没有完整适配器时继续拒绝拥有图检查。 此接口只描述结果,不描述运行中的任务帧。Trace/析构代码仍须驻留到结果销毁; 图检查要求调用方保证全图静止。Future 就绪不代表最后一个 worker 已返回,不能 据此许可模块卸载。示例验收先销毁任务池并 join 工作线程,再检查结果图。

xfuture* xrtTaskSubmitTraced(xtaskpool* pool, xtaskproc proc, ptr data, const xtaskargs* args, xfutureownershiptrace resultTrace)

xrtTaskSubmitWait函数

等待任务池出现队列槽位后提交;任务池工作线程不得阻塞等待所属池。

xfuture* xrtTaskSubmitWait(xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs)

参数

参数方向约束说明
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_STATE — 在所属池工作线程内阻塞等待
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 等待槽位提交

		((arrFutures[0] = xrtTaskSubmitWait(pPool, exampleTask,
			NULL, NULL)) == NULL) ||

xrtTaskSubmitFor函数

在相对毫秒数内等待任务池出现队列槽位并提交。

xfuture* xrtTaskSubmitFor(xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs, int64 iTimeout)

参数

参数方向约束说明
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数
iTimeout输入—相对毫秒数
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_TIMEOUT — 槽位等待超时
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 限时槽位提交

		((arrFutures[1] = xrtTaskSubmitFor(pPool, exampleTask,
			NULL, NULL, EXAMPLE_TIMEOUT_MS)) == NULL) ||

xrtTaskSubmitForCancel函数

等待槽位、截止时间或调用方取消;等待取消不取消已经受理的任务。

xfuture* xrtTaskSubmitForCancel(xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs, int64 iTimeout, xcancel* pCancel)

参数

参数方向约束说明
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数
iTimeout输入—单调时钟截止时间
pCancel输入允许空调用方取消令牌
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_TIMEOUT — 槽位等待超时
  • XERR_CANCELLED — 等待被取消,任务未受理
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 可取消槽位提交

		((arrFutures[4] = xrtTaskSubmitForCancel(pPool,
			exampleTask, NULL, NULL,
			EXAMPLE_TIMEOUT_MS,
			pCancel)) == NULL) ) {

xrtTaskPoolClose函数

停止接收普通任务,并让已经受理的任务与内部资源回收过程自然排空。

bool xrtTaskPoolClose(xtaskpool* pPool)

参数

参数方向约束说明
pPool输入非空目标任务池
返回值
返回含义失败时状态
true已关闭—
false参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 池已销毁

范例已编译验证

task_tour · 关闭

	if ( !xrtTaskPoolClose(pPool) ||
		(xrtTaskPoolWaitFor(pPool, EXAMPLE_TIMEOUT_MS) !=
			XWAIT_OK) ||
		!xrtTaskPoolGet(pPool, &Stats) ||
		(Stats.Completed < 5u) ||
		(Stats.Succeeded < 5u) ||
		!Stats.Closed ) {

xrtTaskPoolCancel函数

停止接收新任务,取消排队任务并请求运行任务协作取消。

bool xrtTaskPoolCancel(xtaskpool* pPool)

参数

参数方向约束说明
pPool输入非空目标任务池
返回值
返回含义失败时状态
true请求已发出—
false参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 池已销毁

范例已编译验证

task_tour · 取消

				(xrtTaskPoolCancel(pFullPool) ) ) {

xrtTaskPoolWait函数

等待已关闭任务池中的全部受理任务进入终态。

xwaitresult xrtTaskPoolWait(xtaskpool* pPool)

参数

参数方向约束说明
pPool输入非空目标任务池
返回值
返回含义失败时状态
XWAIT_OK全部项进入终态—
XWAIT_TIMEOUT期限或截止时间先到达不设错误
XWAIT_CANCELLED调用方取消触发不设错误
XWAIT_ERROR参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 池未关闭或已销毁

范例已编译验证

task_tour · 等待排空

		(void)xrtTaskPoolWait(pFullPool);

xrtTaskPoolWaitFor函数

在相对毫秒数内等待已关闭任务池排空。

xwaitresult xrtTaskPoolWaitFor(xtaskpool* pPool, int64 iTimeout)

参数

参数方向约束说明
pPool输入非空目标任务池
iTimeout输入—相对毫秒数
返回值
返回含义失败时状态
XWAIT_OK全部项进入终态—
XWAIT_TIMEOUT期限或截止时间先到达不设错误
XWAIT_CANCELLED调用方取消触发不设错误
XWAIT_ERROR参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 池未关闭或已销毁

范例已编译验证

task_tour · 限时等待排空

		(xrtTaskPoolWaitFor(pPool, EXAMPLE_TIMEOUT_MS) !=
			XWAIT_OK) ||

xrtTaskPoolWaitForCancel函数

等待池排空、截止时间或调用方取消中的首个事件。

xwaitresult xrtTaskPoolWaitForCancel(xtaskpool* pPool, int64 iTimeout, xcancel* pCancel)

参数

参数方向约束说明
pPool输入非空目标任务池
iTimeout输入—单调时钟截止时间
pCancel输入允许空调用方取消令牌
返回值
返回含义失败时状态
XWAIT_OK全部项进入终态—
XWAIT_TIMEOUT期限或截止时间先到达不设错误
XWAIT_CANCELLED调用方取消触发不设错误
XWAIT_ERROR参数或状态非法XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 池未关闭或已销毁

范例已编译验证

task_tour · 可取消等待排空

			xwaitresult iWait = xrtTaskPoolWaitForCancel(
				pFullPool,
				EXAMPLE_TIMEOUT_MS,
				pCancel);

xrtTaskPoolGet函数

复制任务池统计快照。

bool xrtTaskPoolGet(const xtaskpool* pPool, xtaskpoolstats* pStats)

参数

参数方向约束说明
pPool输入非空目标任务池
pStats输出非空接收统计快照
返回值
返回含义失败时状态
true快照已写出—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

task_tour · 池统计

		!xrtTaskPoolGet(pPool, &Stats) ||

xrtTaskPoolDestroy函数

关闭、排空、终止工作线程并释放任务池;工作线程不能销毁自身所属的池。

bool xrtTaskPoolDestroy(xtaskpool* pPool)

参数

参数方向约束说明
pPool输入非空目标任务池
返回值
返回含义失败时状态
true已销毁—
false工作线程自销毁或状态非法XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 在所属池工作线程内调用或池状态非法

范例已编译验证

task_tour · 销毁

		xrtTaskPoolDestroy(pPool2);
任务组与任务池

xrtTaskGroupSubmit函数

立即向任务池提交并原子纳入组;队列已满时完整回滚组预留。

xfuture* xrtTaskGroupSubmit(xtaskgroup* pGroup, xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs)

参数

参数方向约束说明
pGroup输入非空目标任务组
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数(名称、取消令牌等)
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_AGAIN — 队列已满,组预留完整回滚
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

report · 组提交

		arrFuture[i] = xrtTaskGroupSubmit(
			pGroup,
			pContext->Pool,
			reportPartRun,
			&pContext->Parts[i],
			NULL
		);

xrtTaskGroupSubmitWait函数

等待任务池槽位后提交;组取消会中止尚未受理的容量等待。

xfuture* xrtTaskGroupSubmitWait(xtaskgroup* pGroup, xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs)

参数

参数方向约束说明
pGroup输入非空目标任务组
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数(名称、取消令牌等)
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_STATE — 在所属池工作线程内阻塞等待
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 组等待槽位提交

			((arrFutures[5] = xrtTaskGroupSubmitWait(pGroup,
				pPool2, exampleTask, NULL, NULL)) ==
				NULL) ||

xrtTaskGroupSubmitFor函数

在相对毫秒数内等待任务池槽位并原子纳入组。

xfuture* xrtTaskGroupSubmitFor(xtaskgroup* pGroup, xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs, int64 iTimeout)

参数

参数方向约束说明
pGroup输入非空目标任务组
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数(名称、取消令牌等)
iTimeout输入—相对毫秒数
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_TIMEOUT — 槽位等待超时
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_group_pool · 组限时槽位提交

		arrFuture[i] = xrtTaskGroupSubmitFor(
			pGroup,
			pPool,
			groupedWork,
			&arrValue[i],
			NULL,
			UINT64_C(2000000)
		);

xrtTaskGroupSubmitForCancel函数

同时受截止时间、调用方取消和任务组取消约束地等待提交。

xfuture* xrtTaskGroupSubmitForCancel(xtaskgroup* pGroup, xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs, int64 iTimeout, xcancel* pCancel)

参数

参数方向约束说明
pGroup输入非空目标任务组
pPool输入非空目标任务池
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数(名称、取消令牌等)
iTimeout输入—单调时钟截止时间
pCancel输入允许空调用方取消令牌
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_TIMEOUT — 槽位等待超时
  • XERR_CANCELLED — 等待被取消
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_tour · 组可取消槽位提交

			xfuture* pThird = xrtTaskGroupSubmitForCancel(
				pGroup, pPool2, exampleTask, NULL, NULL,
				EXAMPLE_TIMEOUT_MS,
				pCancel);
协程任务

xrtTaskCo函数

从任意线程向指定或当前协程调度器提交任务,并返回独立生命周期的 Future。

xfuture* xrtTaskCo(struct xcosched* pSched, xtaskproc pProc, ptr pData, const xtaskargs* pArgs, size_t iStackSize)

参数

参数方向约束说明
pSched输入允许空协程调度器,空 = 当前
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数
iStackSize输入0 = 默认协程栈字节数
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_coroutine · 协程任务

	pFuture = xrtTaskCo(pSched, delayedValue, &iValue, NULL, 0);

xrtTaskGroupCo函数

向协程调度器提交任务,并在同一预留窗口内原子纳入任务组。

xfuture* xrtTaskGroupCo(xtaskgroup* pGroup, struct xcosched* pSched, xtaskproc pProc, ptr pData, const xtaskargs* pArgs, size_t iStackSize)

参数

参数方向约束说明
pGroup输入非空目标任务组
pSched输入允许空协程调度器,空 = 当前
pProc输入非空任务过程
pData输入任意值任务数据,受理后所有权转移
pArgs输入允许空任务参数
iStackSize输入0 = 默认协程栈字节数
返回值
返回含义失败时状态
非空任务 Future(引用 1)—
NULL提交失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_CLOSED — 组或池已关闭,不再接纳新项
  • XERR_MEMORY — 对象或槽位分配失败

范例已编译验证

task_group_coroutine · 组协程任务

	pFuture = xrtTaskGroupCo(
		pGroup,
		pSched,
		groupedCoroutine,
		&iValue,
		NULL,
		0
	);
补充参考 · 契约见公共头注释

xrtTaskProducerPolicyV1Get函数

契约注释见公共头文件。

XRT_EXTERN_C_BEGIN XRT_API const xfutureproducerownershipv1* xrtTaskProducerPolicyV1Get()

xrtTaskOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtTaskOwnershipAdapterV1(xrtownershipref Reference, const xtaskdataownershipv1* const* pPolicies, size_t iPolicyCount, const xrtownershippreparationv1** ppPreparation)

xrtTaskPoolOwnership函数

契约注释见公共头文件。

XRT_API xrtownershipref xrtTaskPoolOwnership(const xtaskpool* pPool)

xrtTaskPoolOwnershipAdapterV1函数

契约注释见公共头文件。

XRT_API const xrtownershipadapterv1* xrtTaskPoolOwnershipAdapterV1(xrtownershipref Reference, const xrtownershippreparationv1** ppPreparation)

xrtTaskSubmitOwnedPolicyV1函数

契约注释见公共头文件。

XRT_API xfuture* xrtTaskSubmitOwnedPolicyV1(xtaskpool* pPool, xtaskproc pProc, ptr pData, const xtaskargs* pArgs, const xfuturepayloadownershipv1* pPolicy)

xrtTaskSubmitOwnedJobV1函数

契约注释见公共头文件。

XRT_API xfuture* xrtTaskSubmitOwnedJobV1(xtaskpool* pPool, ptr pData, xcancel* pCancel, const xtaskdataownershipv1* pDataPolicy, const xfuturepayloadownershipv1* pResultPolicy)

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XRT_TASK_GROUP_CANCEL_ON_CANCELLED见头文件注释
XRT_TASK_GROUP_CANCEL_ON_CLOSED见头文件注释
XRT_TASK_GROUP_CANCEL_ON_FAILED见头文件注释
XRT_TASK_GROUP_CANCEL_ON_STOPPED见头文件注释
XRT_TASK_POOL_QUEUE_LIMIT_DEFAULT见头文件注释
XRT_TASK_POOL_THREAD_LIMIT见头文件注释
XTASK_CANCELLED见头文件注释
XTASK_FAILED见头文件注释
XTASK_SUCCESS见头文件注释