gpt4 book ai didi

c++ - TerminateThread 在线程有无限循环时锁定

转载 作者:行者123 更新时间:2023-11-27 23:19:31 33 4
gpt4 key购买 nike

所以我一直在学习 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.

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

我不知道这是否让我解释正在发生的事情的方式非常困惑,我希望不会。我知道这不是一个“只转储代码,让人们修复它”的地方——我在别人的帖子上读到过,但以防万一你不理解我上面写的东西,或者它有帮助,这里是我的代码:

线程管理器.cpp

http://pastebin.com/0B1N3TAH

线程管理器.h

http://pastebin.com/yfwMJTaz

抱歉,代码写得不好,有些东西还不完整。我仍在努力重新学习 C++ 并学习如何使用 Windows API。但是有人知道我可能做错了什么吗?

最佳答案

使用 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

关于c++ - TerminateThread 在线程有无限循环时锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290394/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com