在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的端口程序
使用Windows slim读取/写入locking
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] 举报,一经查实,本站将立刻删除。