我有一个主线程做了一些不那么沉重的工作,而且我还创建了工作线程,这些线程做了非常繁重的工作。所有文档和示例都显示了如何创建等于std::thread::hardware_concurrency()
的许多硬件线程。但由于主线程已经存在,因此线程数变为std::thread::hardware_concurrency() + 1
。例如:
当然我不想要这个,因为UI(在主线程中完成)由于延迟而变得无法响应。如果我创建std::thread::hardware_concurrency() - 1
线程会发生什么?它会保证主线程和主线程只在单核上运行吗?我怎么检查呢?
P.S。:我正在使用某种池 - 我在程序启动时启动线程并在退出时停止。在执行期间,所有工作线程都运行无限while
循环。
答案 0 :(得分:3)
正如其他人在评论中写的那样,你应该仔细考虑一下你是否可以比操作系统做得更好。
话虽如此, 在技术上是可行的:
使用native_handle
方法获取线程的操作系统句柄。
有关设置线程关联的信息,请参阅操作系统的文档。例如,使用pthreads,您需要pthread_set_affinity
。
这使您可以完全控制每个线程的运行位置。特别是,您可以将其中一个线程作为自己的核心。
请注意,这不是标准的一部分,因为它是一个不可移植的级别。这可能是另一个暗示,它可能不是您正在寻找的东西。
答案 1 :(得分:2)
否 - std::thread::hardware_concurrency()
仅提供有关多线程使用的潜在核心数的提示。您可能对CPU Affinity Masks (Putting Threads on different CPUs)感兴趣。这适用于pthread级别,您可以通过std::thread::native_handle
(http://en.cppreference.com/w/cpp/thread/thread/native_handle)
答案 2 :(得分:2)
根据您的操作系统,您可以获取线程的本机句柄,并使用 pthread_setschedparam()控制其优先级,例如,为工作线程提供比主线程更低的优先级。这可以是UI问题的一种解决方案。通常,线程数不需要与可用HW核心数相匹配。
答案 3 :(得分:1)
有些情况下,您希望能够获得完全控制,并可靠地分析正在发生的事情。您正在使用Windows,但作为示例,可以在多核计算机上排除,例如来自普通Linux OS调度程序的一个核心,并将该核心用于时间要求严格的硬实时任务。从本质上讲,您将拥有该核心并处理它的中断,从而实现接近硬实时响应时间和可预测性的内容。需要仔细编程和分析,并需要付出巨大努力。但如果做得对,那就非常有吸引力。