2008-12-09 96 views
2

我有一些代码,我最初并没有创建使用_beginthreadex和_endthreadex。出于某种原因,当它调用_endthreadex(0)时,调用只会挂起而不会返回。关于通常会导致此呼叫挂起的任何想法?_endthreadex(0)挂起

回答

4

_endthreadex结束线程,所以它不能返回。这就是调用它的关键。

编辑:调用_endthreadex有点不寻常,通常你只是让线程启动过程返回并且运行时为你调用_endthreadex。您可能需要更多地解释一下,在我们提供帮助之前,您正在尝试做什么。

0

好....好,endthreadex获取通过“删除Children子” ......和析构函数调用不会返回......所以整个事情挂我的课的解构所谓

+0

什么是挂?调用_endthreadex的线程不再执行,因此它不能执行挂起。 – 2008-12-09 15:27:31

+0

亚当你找到任何解决方案?我只是陷入了同样的情况。从DLL中的静态对象的dtors中销毁线程是否正确? – StNickolay 2013-08-21 14:08:43

1

你误打电话_endthreadex()尝试从主线程结束一个线程?

函数_endthreadex()是为了在要终止的线程中调用,以报告返回值,并为适当的“为线程分配的资源恢复”进行调用。你不需要在主线程的析构函数中调用它。您可以在析构函数中通过一个事件(参见SetEvent,从主线程调用)向线程发出信号,表示线程应尽快退出,然后以最后一条语句退出的线程将调用_endthreadex()

在你的主线程中调用_endthreadex()会导致进程挂起,因为你已经终止了你的主线程,但是你仍然有你想要终止的原始线程仍在运行。

8

我的回答太晚了,但仍有人会使用它。

在我的情况下,_endthreadex在我卸载dll并删除了一些全局对象时被绞死。全局对象之一有另一个线程内部,该线程也执行线程退出。由于DLLMain已经锁定了crt内存映射,所以造成了死锁。阅读DLLMain帮助,并发现在DLLMain调用期间不允许对另一线程或进程执行任何其他操作。