Windows 线程等待方法

Posted

技术标签:

【中文标题】Windows 线程等待方法【英文标题】:Windows Threading Wait Method 【发布时间】:2009-05-01 14:38:42 【问题描述】:

我正在创建一个线程类来封装 Windows 线程方法。我正在尝试创建一种方法,使应用程序在退出应用程序之前等待线程完成。如果我使用 while 循环和布尔标志,它可以工作,但显然它会增加我的 CPU 使用率,而且并不理想。

你会用什么方法来等待一个线程的完成?我并不是真的在这里寻找代码,只是要研究的领域。

【问题讨论】:

【参考方案1】:

使用 CreateThread 获取线程句柄后,将其传递给 Win32 API WaitForSingleObject:

WaitForSingleObject(threadhandle, INFINITE);

如果您不使用 CreateThread(因为您使用了另一个线程包),或者您的线程可能一直处于活动状态......

那么你仍然可以使用 WaitForSingleObject。只需首先使用 Win32 API CreateEvent 创建一个事件,然后等待使用 WaitForSingleObject 设置该事件。在您的线程结束时使用SetEvent 设置事件,您可以使用ResetEvent 重置事件。

尽管大多数线程包都有自己的等待线程的方式。就像在 boost::thread 中一样,您可以使用 .join() 或 boost::condition.

【讨论】:

唯一的问题是我想重用这个线程,所以当工作单元(一个函子)完成时,线程被挂起,所以 WaitForSingleObject 无限期运行 好,那你可以用我说的事件方法来代替。 虽然在所述情况下它可能是“无害的”,但一般来说,挂起线程并不是一种干净的方法。当没有任务要完成时让线程阻塞,永远不要挂起它们。暂停是邪恶的。另外,让线程退出,而不是死亡。在程序结束时,向工作人员发送一个“退出”任务,然后等待它的句柄。让线程干净地退出(而不是在进程终止时被杀死)是确保没有数据损坏的唯一形式上正确的方法。请注意,线程意外死亡可能会在文件完成之前中止写入文件。 我对此进行了测试,等待后我仍然可以中断线程(它仍在运行)。这个答案可能不完整。

以上是关于Windows 线程等待方法的主要内容,如果未能解决你的问题,请参考以下文章

windows API主线程如何等待子线程结束后再继续运行

使用 JNA 本机等待调用检测线程中断 (Windows)

java面试基础问题积累----多线程,并发

Qt5:如何在线程中等待信号?

WPF 自定义快速实现线程等待函数FastTask

如何实现线程互等,线程2等待线程1结束后才继续执行。(可设置标志位) 求源代码