确保主线程仅在自己的内核上运行

Make sure that main thread run on it's own core alone

本文关键字:内核 运行 自己的 线程 确保      更新时间:2023-10-16

我有一个主线程,它做一些不太繁重的工作,而且我正在创建做非常繁重的工作的工作线程。所有文档和示例都展示了如何创建多个等于 std::thread::hardware_concurrency() 的硬件线程。但是由于主线程已经存在,线程的数量变得std::thread::hardware_concurrency() + 1 。例如:

  • 我的机器支持 2 个硬件线程。
  • 在主线程中,我正在创建这 2 个线程,线程总数变为 3。
  • 具有主线程的内核执行其工作以及(可能)辅助角色工作。

当然,我不希望这样,因为 UI(在主线程中完成)由于延迟而变得无响应。如果我创建std::thread::hardware_concurrency() - 1线程会发生什么?它能保证主线程和唯一的主线程在单核上运行吗?如何检查?

PS:我正在使用某种池 - 我在程序启动时启动线程并在退出时停止。在执行期间,所有工作线程都无限while循环运行。

正如其他人在评论中所写的那样,您应该仔细考虑是否可以比操作系统做得更好。

话虽如此,技术上可行的:

  1. 使用 native_handle 方法获取线程的操作系统句柄。

  2. 请参阅操作系统的文档以设置线程相关性。 例如,使用 pthreads,您需要pthread_set_affinity .

这使您可以完全控制每个线程的运行位置。特别是,您可以为其中一个线程提供自己的内核。

请注意,这不是标准的一部分,因为它是一个不可移植的级别。这可能作为另一个提示,它可能不是你要找的。

否 - std::thread::hardware_concurrency() 仅为您提供有关用于多线程的潜在内核数量的提示。您可能对 CPU 关联掩码(将线程放在不同的 CPU 上)感兴趣。这适用于您可以通过std::thread::native_handle(http://en.cppreference.com/w/cpp/thread/thread/native_handle)到达的pthread级别

根据您的操作系统,您可以获取线程的本机句柄,并使用 pthread_setschedparam() 控制它们的优先级,例如,为工作线程提供低于主线程的优先级。这可以是 UI 问题的一种解决方案。通常,线程数不必与可用硬件内核数匹配。

在某些情况下,您肯定希望能够获得完全控制,并可靠地分析正在发生的事情。您使用的是Windows,但例如,在多核计算机上,可以从普通的Linux操作系统调度程序中排除一个内核,并将该内核用于时间关键型硬实时任务。从本质上讲,您将拥有该内核并为其处理中断,从而实现接近硬实时响应时间和可预测性。需要仔细编程和分析,并且需要付出巨大的努力。但如果做得好,非常有吸引力。