Windows – Win32无法恢复自行暂停的线程
发布时间:2020-12-14 05:35:50 所属栏目:Windows 来源:网络整理
导读:在Win32中,我想使用Suspend(GetCurrentThread())挂起一个线程;但我发现我无法使用ResumeThread(暂停线程句柄)恢复它;但我发现什么都没发生. 这是我的代码. HANDLE C;DWORD WINAPI A (LPVOID in){ C = GetCurrentThread(); cout "1"; SuspendThread (C); cout
在Win32中,我想使用Suspend(GetCurrentThread())挂起一个线程;但我发现我无法使用ResumeThread(暂停线程句柄)恢复它;但我发现什么都没发生.
这是我的代码. 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,A,NULL,NULL); CreateThread (NULL,B,NULL); Sleep (INFINITE); return 0; } 我在屏幕上看到的只有123. 解决方法
现在可以在B调用ResumeThread时,变量C包含未初始化的值.
但是,当前代码不起作用的原因是GetCurrentThread只返回一个伪线程句柄,一个被解释为表示当前线程句柄的值.要获得可以从其他线程使用的真实线程,您可以从第一个CreateThread调用的返回中获取一个或使用DuplicateHandle转换伪句柄. 编辑:使用方法1: 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,(LPVOID)C,NULL); Sleep (INFINITE); return 0; } 事实上,您的代码还有另一个问题,即CreateThread返回的句柄在关闭时会被忽略.还有一个缺乏错误检查,但我认为你为了简洁省略了. 您还应注意,根据上下文切换的时间,实际上可以输出上述代码:
使用方法2: HANDLE C = NULL; DWORD WINAPI A (LPVOID in) { C = GetCurrentThread(); DuplicateHandle( GetCurrentProcess(),C,GetCurrentProcess(),&C,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,NULL); Sleep (INFINITE); return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |