【问题标题】:Joining and terminating a windows thread加入和终止 Windows 线程
【发布时间】:2013-02-20 08:51:25
【问题描述】:

我正在尝试使用以下 Windows 线程创建线程:

HANDLE hUSBPollThread = CreateThread(
            NULL,
            NULL,
            USBCan::CreateUSBPollLoop,
            (LPVOID) this,
            0,
            &outThreadID);  

但是我找不到任何从线程外部加入或终止线程的函数。谁能指出我正确的方向?

【问题讨论】:

  • 这看起来很有希望:stackoverflow.com/questions/811641/…
  • 1.简单连接 = WaitForSingleObject(hUSBPollThread,INFINITE); 2. 永远不要调用 TerminateThread(),除非您将其作为紧急关闭序列的一部分(即使这样,尽一切可能的人为努力避免不得不这样做)。

标签: c++ windows multithreading winapi handle


【解决方案1】:

如果你在外部终止线程,你怎么能确定没有资源泄漏,没有同步对象被锁定?是的,您可以使用 TerminateThread 杀死线程,但您不应该这样做。

你要做的是:你发出一个内部事件,你想终止线程操作,线程 proc 最终会注意到这个请求并返回/退出关闭线程活动。

【讨论】:

  • 那么你会如何发出信号呢?我在我的 Uninitialize 函数中实际尝试做的是:将 bool threadRunning 设置为 false 并等待几秒钟让线程退出。如果没有,那么我想强制它关闭。
  • 上面的第一条评论有一个链接,它解释了SetEvent 的信号。
  • 关于"If it doesn't then I want to force it to shut down." 与其做错事,不如测试看看是否会发生这种情况。如果你编码正确,它就不会发生。 TerminateThread 是邪恶的。
  • @MiroBucko:您回答了自己的问题。 “你会怎么发信号?” “将 bool threadRunning 设置为 false”。这是一种简单的信号。 CreateUSBPollLoop() 会定期检查threadRunning 并在它为假时退出。将threadRunning 设置为false 后,使用WaitForSingleObject() 等待线程自行终止指定的时间。如果超时,那么您可以使用TerminateThread()(但除非您别无选择,否则不建议这样做)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多