多线程排挤了其他进程
Multithreading crowds out other processes
我已经为我正在编写的光线追踪器添加了多线程,虽然它现在确实运行得更快,但当它运行时,我的计算机几乎无法使用。显然,我想使用我PC的所有计算能力,但我不希望它阻止任何其他应用程序访问CPU。
我想过让线程睡觉,但除非它们同时睡觉,否则其他线程只会占用额外的时间。此外,如果我不打算使用它,我不一定想放弃一定比例的可用计算能力。
另外,(这不是我的官方问题)我注意到,由于某种原因,启动的第一个线程比第二个线程做更多的工作,第二个线程比第三个线程做更多的工作,依此类推,直到最后 5 个线程(共 32 个)实际上不会在任何工作中出现裂缝,尽管事实上有很多事情要做(至少有 0.5M 的工作项供他们咀嚼)。如果有人想在评论中冒险猜测,将不胜感激。
如果使用标准线程,则可以尝试使用thread::hardware_concurrency
来估计硬件真正支持的最大线程数,以免使CPU过载。
如果返回 0,则信息不可用。 在其他情况下,您可以将自己限制在这个数字或以下一点(认为其他进程也可能使用这些数字)。
如果限制线程数不能提高响应能力,您还可以考虑不时调用this_thread::yield()
以提供重新调度线程的机会。 但是,根据您使用的作业和同步类型,第二种选择可能会降低性能。
按照要求,我的评论作为答案:
听起来你已经超额订阅了你可怜的CPU。尝试减少线程数?
如果线程比硬件内核多得多,那么在线程之间切换、在操作系统中调度它们以及争用共享变量将浪费大量时间。这也会导致其他正在运行的程序普遍变慢,因为它们必须与程序中的大量线程(默认情况下,在操作系统调度程序的眼中,这些线程与其他程序的线程具有相同的优先级)。
- 如何在 Linux 下使用 c++ 知道文件是否被其他进程使用?
- 删除提升interprocess_mutex,当其他进程可能正在使用它时
- 线性搜索 MPI(在其他进程中停止)
- FIFO块程序,直到其他进程读取
- 将 c++ 代码中的当前用户环境变量设置为对其他进程(如 cmds)可见
- 如何确保 boost::文件系统::remove 不会尝试删除由其他进程使用的文件
- 使用分配给其他进程的内存
- 其他进程在MPI_Sendrecv后挂起
- 如何从一个进程向多个其他进程发送信号
- Win32 将同步事件发送到其他进程
- 从其他进程获取 CoGetClassObject
- MPI如何使在根进程中初始化的变量在其他进程中可见
- 多线程排挤了其他进程
- 删除被其他进程锁定的文件
- 编辑其他进程内存
- 如果我删除其他进程的共享内存,会发生什么
- C/C++标准函数,用于检查文件是否被其他进程使用
- DBus和其他进程间通信方法的区别
- 从其他进程获取模块句柄
- 从HWND获取图标进程,进程名或其他进程标识符