【发布时间】: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