微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在Win32中我想暂停一个线程使用Suspend(GetCurrentThread()); 但我发现我无法使用ResumeThread(suspend thread handle);继续它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,A,NULL,NULL); CreateThread (NULL,B,NULL); Sleep (INFINITE); return 0; }

而我在屏幕上得到的是123 。

信号手柄有单独的堆栈吗?

使用CreateEvent和WaitForMultipleObjects到Linux的端口程序

我可以创build一个线程与它的堆栈在一个特定的地址?

使用Windows slim读取/写入locking

后台处理在PHP中使用pthread

Windows'rand_s线程安全吗?

检查线程是否完成的正确方法

我可以从不同的线程调用socket send()吗?

我应该为我的应用程序使用进程还是线程?

sigwait()和信号处理程序

现在有可能当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返回的句柄在关闭时被忽略。 还有一个缺乏错误检查,但我认为你已经省略了简短。

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

1243

使用方法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; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐