我有一些我最初没有使用_beginthreadex和_endthreadex创建的代码。出于某种原因,当它调用_endthreadex(0)时,调用只会挂起而永远不会返回。关于通常会导致此调用挂起的任何想法?
答案 0 :(得分:9)
我的答案太迟了,但仍有人会使用它。
在我的情况下_endthreadex在我卸载dll并删除了一些全局对象时被绞死了。其中一个全局对象内部有另一个线程,该线程也执行了线程退出。这导致死锁,因为DLLMain已经锁定了crt内存映射。阅读DLLMain帮助,发现在DLLMain调用期间不允许对其他线程或进程执行任何其他操作。
答案 1 :(得分:4)
_endthreadex结束线程,因此无法返回。这就是调用它的重点。
编辑:调用_endthreadex有点不寻常,通常你只是让线程启动过程返回,运行时为你调用_endthreadex。在我们可以提供帮助之前,您可能需要更多地解释一下您要做的事情。答案 2 :(得分:1)
您是否错误地调用_endthreadex()尝试从主线程结束线程?
函数_endthreadex()旨在在要终止的线程内调用以报告返回值,并为正确的“恢复为线程分配的资源”。您不需要在主线程的析构函数中调用它。你可以在析构函数中通过一个事件(参见SetEvent,从主线程调用)向线程发出信号,告知线程应该尽快退出,然后作为最后一个语句退出的线程将致电_endthreadex()。
在主线程中调用_endthreadex()将导致进程挂起,因为您已终止主线程,但您仍然希望终止的原始线程仍在运行。
答案 3 :(得分:0)
好的......好吧,endthreadex在我的类的解构器中通过“delete classinstance”调用...并且解构函数调用永远不会返回...所以整个事情都会挂起