AvRtCreateThreadOrderingGroup 函数 (avrt.h)

创建线程排序组。

若要防止线程排序组的服务器线程在较高优先级的客户端线程正在运行时被耗尽,请使用 AvRtCreateThreadOrderingGroupEx 函数。

语法

AVRTAPI BOOL AvRtCreateThreadOrderingGroup(
  [out]          PHANDLE        Context,
  [in]           PLARGE_INTEGER Period,
  [in, out]      GUID           *ThreadOrderingGuid,
  [in, optional] PLARGE_INTEGER Timeout
);

参数

[out] Context

指向上下文句柄的指针。

[in] Period

指向以 100 纳秒为增量的值的指针,该值指定线程排序组的周期。 线程排序组中的每个线程在此期间运行一次。 如果所有线程在时间段结束前完成其执行,则所有线程将等待该时间段的剩余时间过后,然后再次执行任何线程。

此参数的可能值取决于平台,但此参数可以低至 500 微秒或高达 0x1FFFFFFFFFFFFFFF。 如果此参数小于 500 微秒,则将其设置为 500 微秒。 如果此参数大于最大值,则将其设置为0x1FFFFFFFFFFFFFFF。

[in, out] ThreadOrderingGuid

指向要创建的线程排序组的唯一标识符的指针。 如果此值对于线程排序服务不是唯一的,则函数将失败。

如果在输入时GUID_NULL标识符,则线程排序服务将生成并返回唯一标识符。

[in, optional] Timeout

指向超时值的指针。 组内的所有线程都应在 PeriodTimeout 内完成其执行。

如果线程未能在该时间段加上此超时间隔内完成其处理,则会将其从线程排序组中删除。 如果父级未能在时间段加上超时间隔内完成其处理,则会销毁线程排序组。

此参数的可能值取决于平台,但可以低至 500 微秒或高达 0x1FFFFFFFFFFFFFFF。 如果此参数小于 500 微秒,则将其设置为 500 微秒。 如果此参数大于最大值,则将其设置为0x1FFFFFFFFFFFFFFF。

如果此参数为 NULL 或 0,则默认值为 Period 值的五倍。

如果此参数THREAD_ORDER_GROUP_INFINITE_TIMEOUT,则创建具有无限超时间隔的组。 这可用于调试目的。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

如果已存在具有指定标识符的线程排序组,该函数将失败,并将最后一个错误设置为ERROR_ALREADY_EXISTS。

注解

调用线程被视为父线程。 每个线程排序组都有一个父线程。 每个父线程可以有零个或多个前置线程和零个或多个后续线程。 客户端线程可以加入线程排序组,并使用 AvRtJoinThreadOrderingGroup 函数指定它是前置任务组还是后续线程。

父线程将每个周期内要执行的代码包含在由 AvRtWaitOnThreadOrderingGroup 函数控制的循环中。

若要删除线程排序组,请调用 AvRtDeleteThreadOrderingGroup 函数。

一个线程可以创建多个线程排序组,并联接多个线程排序组。 但是,线程不能多次加入同一线程排序组。

示例

以下代码片段创建线程排序组。

#include <windows.h>
#include <avrt.h>
#include <stdio.h>

#pragma comment(lib, "Avrt.lib")

#define _100NS_IN_1MS 10000

int main( void )
{
    HANDLE hContext = NULL;
    LARGE_INTEGER period, timeout;
    GUID guid = { 0 };
    BOOL bRes;

    period.QuadPart = Int32x32To64(_100NS_IN_1MS, 1000);   // 1 second
    timeout.QuadPart = Int32x32To64(_100NS_IN_1MS, 10000); // 10 seconds

    bRes = AvRtCreateThreadOrderingGroup( 
            &hContext,
            &period,
            &guid,
            &timeout );

    if( bRes != TRUE )
    {
        printf("Error creating group (%d)\n", GetLastError());
            return 1;
    }

    return 0;
}

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 avrt.h
Library Avrt.lib
DLL Avrt.dll

另请参阅

线程排序服务