当线程具有无限循环时,TerminateThread会锁定

时间:2013-01-12 04:59:34

标签: c++ windows multithreading

所以我一直在学习Windows API中的线程,我写了一些测试代码,但是我遇到了一些问题。首先,我有两个功能:

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.

我将我创建的线程HANDLEs放入向量中,但这是无关紧要的。基本上我有上面的代码工作,它创建线程很好。当我使用MyThreadFunction2创建线程时,我遇到的问题是调用TerminateThread(HANDLE,0),它永远循环。当我调用TerminateThread时,我的程序就冻结并坐在那里。似乎线程已停止,因为我没有收到“Working ...”消息,但它不会继续任何其他代码。但是,当我使用MyThreadFunction调用同样的函数时,它可以正常工作。

我不知道如何解释发生的事情是非常令人困惑的,我希望不是。我知道这不是一个“只是转储代码,让人们修复它”的地方 - 我在其他人的帖子上看到了这个,但只是因为你不理解我上面写的东西,或者它有用,这里是我的代码:

ThreadManager.cpp

http://pastebin.com/0B1N3TAH

ThreadManager.h

http://pastebin.com/yfwMJTaz

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

1 个答案:

答案 0 :(得分: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