确保主线程单独运行它自己的核心

时间:2016-01-26 08:52:39

标签: c++ multithreading c++11

我有一个主线程做了一些不那么沉重的工作,而且我还创建了工作线程,这些线程做了非常繁重的工作。所有文档和示例都显示了如何创建等于std::thread::hardware_concurrency()的许多硬件线程。但由于主线程已经存在,因此线程数变为std::thread::hardware_concurrency() + 1。例如:

  • 我的机器支持2个硬件线程。
  • 在主线程中我创建了这2个线程,线程总数变为3。
  • 主线程的核心是它的工作加上(可能)工人的工作。

当然我不想要这个,因为UI(在主线程中完成)由于延迟而变得无法响应。如果我创建std::thread::hardware_concurrency() - 1线程会发生什么?它会保证主线程和主线程只在单核上运行吗?我怎么检查呢?

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

  3. 这使您可以完全控制每个线程的运行位置。特别是,您可以将其中一个线程作为自己的核心。

    请注意,这不是标准的一部分,因为它是一个不可移植的级别。这可能是另一个暗示,它可能不是您正在寻找的东西。

答案 1 :(得分:2)

否 - std::thread::hardware_concurrency()仅提供有关多线程使用的潜在核心数的提示。您可能对CPU Affinity Masks (Putting Threads on different CPUs)感兴趣。这适用于pthread级别,您可以通过std::thread::native_handlehttp://en.cppreference.com/w/cpp/thread/thread/native_handle

访问该级别

答案 2 :(得分:2)

根据您的操作系统,您可以获取线程的本机句柄,并使用 pthread_setschedparam()控制其优先级,例如,为工作线程提供比主线程更低的优先级。这可以是UI问题的一种解决方案。通常,线程数不需要与可用HW核心数相匹配。

答案 3 :(得分:1)

有些情况下,您希望能够获得完全控制,并可靠地分析正在发生的事情。您正在使用Windows,但作为示例,可以在多核计算机上排除,例如来自普通Linux OS调度程序的一个核心,并将该核心用于时间要求严格的硬实时任务。从本质上讲,您将拥有该核心并处理它的中断,从而实现接近硬实时响应时间和可预测性的内容。需要仔细编程和分析,并需要付出巨大努力。但如果做得对,那就非常有吸引力。