gpt4 book ai didi

windows - Win32 无法恢复自行挂起的线程

转载 作者:可可西里 更新时间:2023-11-01 14:19:30 26 4
gpt4 key购买 nike

在 Win32 中,我想使用 Suspend(GetCurrentThread()); 暂停一个线程,但我发现我无法使用 ResumeThread(suspend thread handle); 恢复它,但是我发现什么都没发生。

这是我的代码。

HANDLE C;
DWORD WINAPI A (LPVOID in)
{
C = GetCurrentThread();
cout << "1";
SuspendThread (C);
cout << "4";
return 0;
}
DWORD WINAPI B (LPVOID in)
{
Sleep (200);
cout << "2";
ResumeThread (C);
cout << "3";
return 0;
}
int main()
{
CreateThread (NULL, 0, A, NULL, 0, NULL);
CreateThread (NULL, 0, B, NULL, 0, NULL);
Sleep (INFINITE);
return 0;
}

我在屏幕上得到的只是 123

最佳答案

现在有可能当 B 调用 ResumeThread 时,变量 C 包含一个未初始化的值。

但是,当前您的代码不起作用的原因是 GetCurrentThread 仅返回一个伪线程句柄,该值被解释为表示当前线程句柄。要获得可以从其他线程使用的真实句柄,您可以从第一个 CreateThread 调用的返回中获取一个,或者使用 DuplicateHandle 转换伪句柄。

编辑:使用方法一:

HANDLE C;
DWORD WINAPI A (LPVOID in)
{
cout << "1";
SuspendThread (C);
cout << "4";
return 0;
}
DWORD WINAPI B (LPVOID in)
{
Sleep (200);
cout << "2";
ResumeThread ((HANDLE)in);
cout << "3";
return 0;
}
int main()
{
C = CreateThread (NULL, 0, A, NULL, 0, NULL);
CreateThread (NULL, 0, B, (LPVOID)C, 0, NULL);
Sleep (INFINITE);
return 0;
}

事实上,您的代码还有另一个问题,即从 CreateThread 返回的句柄在应该关闭时被忽略了。也缺少错误检查,但我假设您为简洁起见省略了它。

您还应该注意,根据上下文切换的时间,上述代码实际上可能输出:

1243

使用方法二:

HANDLE C = NULL;
DWORD WINAPI A (LPVOID in)
{
C = GetCurrentThread();
DuplicateHandle( GetCurrentProcess(), C, GetCurrentProcess(), &C, 0, FALSE, DUPLICATE_SAME_ACCESS );
cout << "1";
SuspendThread (C);
cout << "4";
return 0;
}
DWORD WINAPI B (LPVOID in)
{
Sleep (200);
cout << "2";

while( C == NULL ) {
Sleep(100);
}
ResumeThread(C);
cout << "3";
return 0;
}
int main()
{
CreateThread (NULL, 0, A, NULL, 0, NULL);
CreateThread (NULL, 0, B, NULL, 0, NULL);
Sleep (INFINITE);
return 0;
}

关于windows - Win32 无法恢复自行挂起的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com