因此,我一直在学习Windows API中的线程,并且编写了一些测试代码,但我遇到了一些问题。首先,我有两个功能:TerminateThread在线程无限循环时锁定
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
int i = (int)lpParam;
cout << i << ".) I work! " << endl;
return 0;
}
而且
// MyThreadFunction2 - loops continuously forever, outputing "working..." every 1ms
DWORD WINAPI MyThreadFunction2(LPVOID lpParam)
{
int i = (int)lpParam;
while(1) {
cout << i << ".) Working... " << endl;
Sleep(1);
}
return 0;
}
而且我创建使用的CreateThread线程,但后来_beginthread我会改变这就是人们告诉我在不同的做但相关的帖子。所以这是我是如何被创建线程:
threads.push_back(CreateThread(
NULL, // default security attributes
0, // use default stack size
lpStartAddress, // thread function name
lpParameter, // arugument to thread function
0, // use default creation flag
NULL)); // ignore thread identifier.
我把线程处理我创造成一个向量,但这是无关紧要的。基本上我有上面的代码工作,并且它创建线程很好。我遇到的问题是在使用MyThreadFunction2创建线程时,调用TerminateThread(HANDLE,0),它永远循环。当我打电话给TerminateThread时,我的程序就冻结并坐在那里。它看起来线程已经停止,因为我没有得到“正在工作...”的消息,但它没有继续任何其他代码。然而,当我用MyThreadFunction调用这个相同的函数时,它工作正常。
我不知道这是非常令人困惑的,我如何解释发生了什么,我希望它不是。我知道这不是一个“转储代码并让人们修复它”的地方 - 我在其他人的帖子上阅读了这篇文章,但是只是因为你不明白我上面写的东西,或者它有帮助,这里是我的代码:
ThreadManager.cpp
ThreadManager.h
对不起代码写得不好,有些事情是不完整的。我仍在努力重新学习C++并学习如何使用Windows API。但是,有没有人有任何想法,我可能会做错什么?
我使用Microsoft Visual Studio 2008中,如果这能帮助任何东西的想法可能是错误的?我怀疑它会。我真的被卡住了,我不知道它为什么锁定。你可以看到我把所有的测试代码放在链接上,但是我不知道它为什么会一直锁住。 –
这很有可能是你杀死你的线程在IO子系统转储字符到你的控制台中间(特别是因为这是有效的*所有*此线程正在做)。控制台IO是线序列化的(我只能假设它使用暴击或其他类似的锁存器,当线程被终止时,它会被锁定,因此会挂起你的世界其余部分。) – WhozCraig