【问题标题】:std::thread increses DLL reference count, which prevents the unloading of the DLLstd::thread 增加 DLL 引用计数,这会阻止 DLL 的卸载
【发布时间】:2023-03-05 08:28:01
【问题描述】:

我有一个由第三方程序加载的 windows c++ dll。我最近添加了一个线程池(这个https://github.com/progschj/ThreadPool/blob/master/ThreadPool.h)。

但是当第三方程序不再需要它时,现在不再卸载 dll。原因是线程池中产生的每个线程都会将 dll 引用计数增加一。 一个问题是我不知道第三方程序什么时候不再需要dll,所以之前不能手动关闭线程池,以减少引用计数。

所以我的问题是,有没有一种方法可以在不增加 dll 引用计数的情况下创建线程? 如果是这样,当 dll 被卸载时,我是否需要手动关闭线程池?

旁注:我使用 vs 2019 和 c++17。

【问题讨论】:

  • 如何增加 dll 引用计数?为什么不在线程结束时再次减少引用计数?
  • 当线程池启动它的线程时,引用计数会自动增加(每个线程增加一个)。问题是,它是一个线程池,在线程池关闭之前没有尽头。而接下来的问题是,我不知道程序什么时候不再需要这个dll了,所以我不能提前关闭它。
  • 我没有看到您在上面链接的线程池源中的 dll 引用计数有任何增加。那么这是在哪里发生的呢?
  • 似乎每次创建线程时都会发生这种情况。所以在第 38 行 workers.emplace_back(
  • 在这种情况下,线程池的每个线程都应该在完成后再次减少 dll 引用计数。这不会发生吗?

标签: c++ multithreading dll reference stdthread


【解决方案1】:

它调用的 DLL_PROCESS_DETACH 呢?如果是这样,您应该加入其中的线程。

【讨论】:

  • DLL_PROCESS_DETACH 很遗憾没有被调用,因为引用计数太高。
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2011-01-27
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多