【发布时间】:2008-12-09 15:05:21
【问题描述】:
我有一些使用 _beginthreadex 和 _endthreadex 的代码,我最初并未创建。出于某种原因,当它调用 _endthreadex(0) 时,调用只是挂起并且永远不会返回。关于通常会导致此调用挂起的任何想法?
【问题讨论】:
标签: c++ multithreading
我有一些使用 _beginthreadex 和 _endthreadex 的代码,我最初并未创建。出于某种原因,当它调用 _endthreadex(0) 时,调用只是挂起并且永远不会返回。关于通常会导致此调用挂起的任何想法?
【问题讨论】:
标签: c++ multithreading
我的回答太晚了,但还是有人会用。
在我的情况下,当我卸载 dll 并删除一些全局对象时,_endthreadex 挂起。其中一个全局对象内部有另一个线程,该线程也执行线程退出。这导致了死锁,因为 DLLMain 已经锁定了 crt 内存映射。阅读 DLLMain 帮助,发现在 DLLMain 调用期间不允许对其他线程或进程执行任何其他操作。
【讨论】:
_endthreadex 结束线程,所以它不能返回。这就是调用它的全部意义所在。
编辑:调用_endthreadex 有点不寻常,通常你只是让线程启动过程返回,运行时为你调用_endthreadex。在我们提供帮助之前,您可能需要再解释一下您想要做什么。
【讨论】:
您是否错误地调用_endthreadex() 试图从主线程结束一个线程?
函数_endthreadex() 旨在在要终止的线程内调用以报告返回值,并正确地“恢复为线程分配的资源”。您不需要在主线程的析构函数中调用它。您可以在析构函数中通过事件(参见SetEvent,从主线程调用)向线程发出信号,表明线程应尽快退出,然后作为最后一条语句退出的线程将调用@ 987654324@.
在主线程中调用 _endthreadex() 会导致进程挂起,因为您已经终止了主线程,但您想要终止的原始线程仍然在运行。
【讨论】:
好的....好吧,endthreadex 通过“删除类实例”在我的类的解构器中被调用...并且该解构器调用永远不会返回...所以整个事情挂起
【讨论】: