【问题标题】:Wait for threads from loaded dll to finish in windows等待加载的 dll 中的线程在 Windows 中完成
【发布时间】:2013-07-30 11:43:20
【问题描述】:

我有一个在我的主应用程序中动态链接的 dll 中运行的线程。有没有办法在不知道线程句柄的情况下等待 .exe 中的所有线程(包括它加载的 dll)?视窗 7 x64, vc++ 线程是一个对某个文件进行一些处理的函数,它不会返回任何东西,它适用于在线程完成的某些阶段被修改的全局类。线程函数调用其他函数。 我想等到函数的最后一行执行完毕。

【问题讨论】:

  • 你需要澄清一下。 “等待线程”意味着等待线程完成。从 DLL 启动的线程可能会尝试等待所有其他进程线程,但实际情况是它是死锁。你需要退后一步,解释你想要达到的目标。
  • 事件是替代方案吗?它们如何跨 dll 工作?
  • 我的意思是你的问题根本没有意义。等待线程你自己的线程很可能锁死。所以你解释你为什么需要这个可能会让你真正的选择。
  • 如果我理解“等待一个exe中的所有线程,包括加载的dll”正确,这相当于进程终止。这就是最后一个线程退出时发生的情况。这意味着您可以简单地等待进程句柄。
  • @Roman R. 我明白你的意思,但是当 main 结束时,我不知道 dll 中的线程是否已完成执行,如果 main 结束进程中的所有线程,对吗?它的行为很奇怪,有时会,有时不会……我无法解释为什么……所以我认为 DLL 线程直到 main 结束才到达执行结束。

标签: windows multithreading winapi visual-c++


【解决方案1】:

我自己从来没有这样做过,但你可能可以

  1. 使用CreateToolhelp32Snapshot创建快照
  2. 然后使用Thread32FirstThread32Next 枚举线程
  3. 对于每个线程 ID,使用OpenThread 获取句柄。确保您以SYNCHRONIZE 权限打开线程,以便您最终可以
  4. 将所有线程句柄传递给WaitForMultipleObjects 以等待它们全部终止。

【讨论】:

    【解决方案2】:

    另一个解决方案,假设你想要的只是停止 main() 函数的运行,但在任何其他线程完成之前不退出进程,那就是调用

    ExitThread(GetCurrentThread());
    

    在 main() 中。如果你不调用ExitProcess,无论是显式调用还是从main()返回,Windows 将在最后一个线程退出之前退出。

    请注意,这样做存在一个主要问题,无论您如何处理它:如果您使用的 Windows API 启动了一个不会退出的线程,您的应用程序也不会退出。

    正确的解决方案是让 DLL 本身包含一个关闭函数,该函数等待其自己的线程在必要时退出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多