如何访问 C++ windows 10 应用程序中的默认线程池?

Posted

技术标签:

【中文标题】如何访问 C++ windows 10 应用程序中的默认线程池?【英文标题】:How to access the default thread pool in C++ windows 10 application? 【发布时间】:2019-09-13 02:06:30 【问题描述】:

根据SO Question: "Why does Windows 10 start extra threads in my program?" 和 Hans Passant 的回答:Windows 10 为 Windows 10 上的每个 C++ 进程启动一个线程池(至少在 VS2013+ 中用 C++ 编译时)。

根据微软文档"Thread Pools"和"Thread Pool API (2018-05-30)",我找不到加入默认进程线程池的方法。

我可以加入默认进程线程池吗?如何加入? ...还是我必须创建一个新的?

这是我可以看到的每个进程拥有多个线程池的几个缺点的列表:

创建了更多本来可以避免的线程 更多休眠线程 额外线程和管理器本身占用更多内存 由于线程池之间可能存在并发,线程管理算法效率较低。

如果我必须创建新线程池而不是每个进程加入/使用一个全局线程池,是否会消除每个进程只有一个线程池的优势?为什么我们不能验证是否已经创建了线程池并直接使用它?为什么不能仅仅加入主进程 thead 池?像 C# 那样只有一个线程池不是更好吗?

旁注:我正在研究一种数学算法,该算法的计算时间足以支持多线程。此外,它是第三方 DLL 库的一部分。能够加入一个已经创建的线程池对我来说似乎比创建一个新线程池更合乎逻辑,并且可能会干扰客户主进程线程和另一个潜在的线程池。

在得到 Raymon Chen 的好回答和好消息后,我发现了这篇我喜欢分享的文章,因为它帮助我更好地理解:Top 20 C++ multithreading mistakes and how to avoid them

【问题讨论】:

“它是否消除了每个进程只有一个线程池的优势?” - 有什么优势? 我不明白你为什么会想到这两件事。无论如何,出于显而易见的原因,用于执行加载 DLL 等操作的进程线程池(如果有的话)不太可能是 MS 允许您访问的东西。 只要调用一个线程池函数,你就会默认使用默认的线程池。 (使用非默认线程池相当困难。) CreateThreadPoolWork 默认在默认线程池中创建工作。如果要使用非默认线程池,则必须创建一个线程池 (CreateThreadPool),并且在向其排队工作时,您必须传递一个自定义环境 (InitializeThreadpoolEnvironment + SetThreadpoolCallbackPool)。顺便说一句,我假设您在谈论系统线程池,因为这些是您链接到的文档。 每个进程都有一个默认的线程池。默认情况下,线程池函数使用默认线程池。所以“加入默认进程线程池”的方法就是开始使用线程池功能。 (不确定 TLS 是如何适应的,或者您为什么要转而谈论在进程之间共享代码。) 【参考方案1】:

std::async 使用 Windows 上的默认线程池,因此您可能希望使用它。

更多详情here 和here。

【讨论】:

非常感谢。我刚刚意识到“std”(stl)实现可能特定于操作系统(这里:Windows),并且可以使用像线程池这样的操作系统部分。很棒的信息。在使用 C# 近 20 年后,我刚刚回到 C++(一点点),并意识到我还有很多东西要学。非常感谢。

以上是关于如何访问 C++ windows 10 应用程序中的默认线程池?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 线程 C++ - 访问冲突

在 Windows 环境中从 C 或 C++ 访问 COM 接口

在 C++ Windows 应用程序中访问命令行参数

Windows C++ 程序中的访问冲突总是会立即崩溃吗?

Windows 安装程序,在 C++ 中访问自定义操作中的自定义属性

如何在 C++ 中读取“特约艺术家”元数据?