2013-01-12 23 views
0

因此,我一直在学习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

http://pastebin.com/0B1N3TAH

ThreadManager.h

http://pastebin.com/yfwMJTaz

对不起代码写得不好,有些事情是不完整的。我仍在努力重新学习C++并学习如何使用Windows API。但是,有没有人有任何想法,我可能会做错什么?

+0

我使用Microsoft Visual Studio 2008中,如果这能帮助任何东西的想法可能是错误的?我怀疑它会。我真的被卡住了,我不知道它为什么锁定。你可以看到我把所有的测试代码放在链接上,但是我不知道它为什么会一直锁住。 –

+2

这很有可能是你杀死你的线程在IO子系统转储字符到你的控制台中间(特别是因为这是有效的*所有*此线程正在做)。控制台IO是线序列化的(我只能假设它使用暴击或其他类似的锁存器,当线程被终止时,它会被锁定,因此会挂起你的世界其余部分。) – WhozCraig

回答

5

使用TerminateThread杀死线程通常是一个非常糟糕的主意。即使这个功能的MSDN页面告诉你。告诉线程停止工作的更好的方法是将它们传递给一个事件。在事件中,运行无限循环的线程将执行while (WaitForSingleObject(event, 1) == WAIT_TIMEOUT)而不是while (1)

到底为什么TerminateThread做什么死了,我不知道,但你可以得到,当你读这http://msdn.microsoft.com/en-us/library/windows/desktop/ms686717(v=vs.85).aspx

+0

借调。 TerminateThread'用于灾难恢复,而不是正常操作。 – StilesCrisis