【问题标题】:Thread Ordering Service isn't enabled未启用线程排序服务
【发布时间】:2021-02-05 11:33:46
【问题描述】:

我正在研究Windows的线程排序服务。所以,我写了下面的代码来测试 TOS 是如何工作的?但它不起作用,它给了我一个错误。

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

#pragma comment(lib, "Avrt.lib")
#define _100NS_IN_1MS 10000

unsigned __stdcall Thread1(void* arg_list)
{
    for (size_t i = 0; i < 100; i++)
    {
        std::cout << "\tHello from Thread1, Repeat #" << i + 1 << std::endl;
        SwitchToThread();
    }
    return 0;
}

unsigned __stdcall Thread2(void* arg_list)
{
    for (size_t i = 0; i < 100; i++)
    {
        std::cout << "\tHello from Thread2, Repeat #" << i + 1 << std::endl;
    }
    return 0;
}


int main()
{
    HANDLE handle_context = NULL;
    LARGE_INTEGER period, timeout;
    GUID guid = { 0 };
    BOOL result;

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

    result = AvRtCreateThreadOrderingGroup(&handle_context, &period, &guid, &timeout);
    
    if (result != TRUE)
    {
        printf("Error creating group (%d)\n", GetLastError());
        return 1;
    }

    HANDLE handle_thread1 = (HANDLE)_beginthreadex(NULL, 0, Thread1, NULL, CREATE_SUSPENDED, NULL);
    HANDLE handle_thread2 = (HANDLE)_beginthreadex(NULL, 0, Thread2, NULL, CREATE_SUSPENDED, NULL);
    
    AvRtJoinThreadOrderingGroup(&handle_thread1, &guid, FALSE);
    AvRtJoinThreadOrderingGroup(&handle_thread2, &guid, FALSE);

    if (handle_thread1 == NULL && handle_thread2 == NULL)
    {
        return -1;
    }

    ResumeThread(handle_thread1);
    ResumeThread(handle_thread2);

    int recieve1 = WaitForSingleObject(handle_thread1, INFINITE);
    int recieve2 = WaitForSingleObject(handle_thread2, INFINITE);

    CloseHandle(handle_thread1);
    CloseHandle(handle_thread2);
}

当我运行上面的程序时,它给了我以下错误:

创建组时出错 (1058) 1058 (0x422)

服务无法启动,可能是因为它被禁用或 因为它没有与之关联的已启用设备。

我现在该怎么办?我正在使用 Windows 10。

【问题讨论】:

  • 文档 (docs.microsoft.com/en-us/windows/win32/procthread/…) 指出:“线程排序服务默认关闭,必须由用户启动”。你启动服务了吗?
  • 对此要非常小心。 TOS 的合法用例极其有限,而你编写糟糕、糟糕、邪恶的代码的方式几乎是无限的。这不是你用来解决随机编程问题的工具,也不是你应该在一般架构中考虑的工具。几乎可以肯定,除了最利基和经过深思熟虑的情况外,这不是所有情况的正确解决方案。
  • 我应该如何启用此服务? @Zaiborg
  • @Cayoot 不幸的是我不知道。快速搜索并没有产生有希望的结果。

标签: c++ multithreading winapi


【解决方案1】:

链接herehere 说明Windows 线程排序服务 默认不开启:

线程排序服务默认关闭,必须由 用户。当线程排序服务运行时,它是 每5秒激活一次,检查是否有新请求, 即使系统空闲。这可以防止系统休眠 超过 5 秒,导致系统消耗更多电量。如果 能源效率对应用至关重要,最好不要 使用线程排序服务,而是允许系统调度程序 管理线程的执行。

还讨论了用例和其他讨论,并且在其他一些链接中提供了代码 sn-ps(请参阅上面的第二个链接。)以下是一个示例:

#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 10 中启用此服务时遇到问题。我不知道应该如何启用它。你能给我解释一下吗?
  • @Cayoot - 这将需要在UAC 上进行一些搜索/阅读,确保您以足够的权限运行等。Windows 10 引入了许多新控件来收紧/限制对几乎所有内容的轻松访问.
  • 我以足够的权限运行程序,但我得到了同样的错误。我也检查了 msconfig -> services,但在那里我找不到线程排序服务。
  • @Cayoot - 您是否已经运行了示例代码,即构建了一个项目并包含了avrt.lib 文件?错误信息到底是什么?
  • 它说:“服务无法启动,要么是因为它被禁用,要么是因为它没有与之关联的启用设备。”我不知道我应该如何运行该服务。我搜索了很多,但我找不到任何信息。
猜你喜欢
  • 2010-09-19
  • 2014-10-24
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2017-12-17
相关资源
最近更新 更多