确保主线程仅在自己的内核上运行
Make sure that main thread run on it's own core alone
我有一个主线程,它做一些不太繁重的工作,而且我正在创建做非常繁重的工作的工作线程。所有文档和示例都展示了如何创建多个等于 std::thread::hardware_concurrency()
的硬件线程。但是由于主线程已经存在,线程的数量变得std::thread::hardware_concurrency() + 1
。例如:
- 我的机器支持 2 个硬件线程。
- 在主线程中,我正在创建这 2 个线程,线程总数变为 3。
- 具有主线程的内核执行其工作以及(可能)辅助角色工作。
当然,我不希望这样,因为 UI(在主线程中完成)由于延迟而变得无响应。如果我创建std::thread::hardware_concurrency() - 1
线程会发生什么?它能保证主线程和唯一的主线程在单核上运行吗?如何检查?
PS:我正在使用某种池 - 我在程序启动时启动线程并在退出时停止。在执行期间,所有工作线程都无限while
循环运行。
正如其他人在评论中所写的那样,您应该仔细考虑是否可以比操作系统做得更好。
话虽如此,技术上是可行的:
-
使用
native_handle
方法获取线程的操作系统句柄。 -
请参阅操作系统的文档以设置线程相关性。 例如,使用 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操作系统调度程序中排除一个内核,并将该内核用于时间关键型硬实时任务。从本质上讲,您将拥有该内核并为其处理中断,从而实现接近硬实时响应时间和可预测性。需要仔细编程和分析,并且需要付出巨大的努力。但如果做得好,非常有吸引力。
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- C++ 异步仅在一个内核上运行?
- CUDA 内核在第二次运行时运行得更快 - 为什么?
- 张量流错误:执行器无法创建内核。没有注册'Snapshot' 适用于 GPU 设备的 OpKernel 运行图像标签示例
- 降低CUDA内核运行时:内核中矩阵的动态内存分配
- 如何在我的进程中运行的二进制文件中注册操作和内核
- 测量内核运行时间
- Mvapich在内核运行时在CUDA内存上僵局
- 当运行的线程数超过内核数时,CUDA性能会得到提高
- FFT 2D 内核运行时 =0 在 OpenCL 中
- 运行并发的CUDA内核,从C 包装器功能调用
- 仅运行 R 的 C 内核
- 如何在其他内核上运行每个线程
- 尝试在64位数据类型上运行简单模板内核时,cudaErrorLaunchFailure
- 在不同的内核上运行 QThreads
- C++ std::future在单独的内核上运行每个函数
- CUDA cudaMalloc在运行带有巨大静态数组的内核后失败
- 基于内核版本 X.XX 构建的 C++ Linux 应用是否会在早期版本上运行
- c++ Cuda 代码未运行内核
- 确保主线程仅在自己的内核上运行