在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
。
答案 0 :(得分:2)
现在有可能在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, 0, A, NULL, 0, NULL);
CreateThread (NULL, 0, B, (LPVOID)C, 0, NULL);
Sleep (INFINITE);
return 0;
}
事实上,您的代码存在另一个问题,即在CreateThread
返回的句柄应该被关闭时会被忽略。还缺少错误检查,但为了简洁,我假设你省略了。
您还应注意,根据上下文切换的时间,实际上可以输出上述代码:
1243
使用方法2:
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;
}