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 线程等待方法的主要内容,如果未能解决你的问题,请参考以下文章