【问题标题】:_endthreadex(0) hangs_endthreadex(0) 挂起
【发布时间】:2008-12-09 15:05:21
【问题描述】:

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

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    我的回答太晚了,但还是有人会用。

    在我的情况下,当我卸载 dll 并删除一些全局对象时,_endthreadex 挂起。其中一个全局对象内部有另一个线程,该线程也执行线程退出。这导致了死锁,因为 DLLMain 已经锁定了 crt 内存映射。阅读 DLLMain 帮助,发现在 DLLMain 调用期间不允许对其他线程或进程执行任何其他操作。

    【讨论】:

    • 为我工作!谢谢!
    【解决方案2】:

    _endthreadex 结束线程,所以它不能返回。这就是调用它的全部意义所在。

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

    【讨论】:

      【解决方案3】:

      您是否错误地调用_endthreadex() 试图从主线程结束一个线程?

      函数_endthreadex() 旨在在要终止的线程内调用以报告返回值,并正确地“恢复为线程分配的资源”。您不需要在主线程的析构函数中调用它。您可以在析构函数中通过事件(参见SetEvent,从主线程调用)向线程发出信号,表明线程应尽快退出,然后作为最后一条语句退出的线程将调用@ 987654324@.

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

      【讨论】:

        【解决方案4】:

        好的....好吧,endthreadex 通过“删除类实例”在我的类的解构器中被调用...并且该解构器调用永远不会返回...所以整个事情挂起

        【讨论】:

        • 挂的是什么?调用 _endthreadex 的线程不再执行,因此它本身不能挂起。
        • 亚当你找到解决办法了吗?我只是坚持同样的情况。从 DLL 中的静态对象的 dtors 中销毁线程是否正确?
        • 所以情况是代码试图在 DLL 终止阶段从静态对象的析构函数中终止线程,这在 Windows 上被拒绝。它会导致僵局。 MSDN,创建 DLL 的最佳实践msdn.microsoft.com/en-us/windows/hardware/gg487379.aspx“调用 ExitThread。在 DLL 分离期间退出线程可能会导致再次获取加载程序锁,从而导致死锁或崩溃。”
        猜你喜欢
        • 1970-01-01
        • 2014-02-08
        • 2020-11-23
        • 1970-01-01
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 1970-01-01
        相关资源
        最近更新 更多