【问题描述】
使用QT的多线程进行计算密集型任务,线程数不少于CPU的逻辑处理单元数,但是在Linux上查看系统监视器,总是只占用一个核(不超过100%),Window下是没有这个问题的。
【问题排查过程】
1. 首先此问题是在做国产化改造(Linux移植)才出现的,Windows上不存在此问题,因此重点在Linux上测试。
2.为了排除干扰,单独写多线程计算的小程序,发现多核CPU可以每个都充分利用都达到100%的。
3.有同事提到了是不是线程被绑定了(线程的CPU亲和性),但是找不到代码中哪里设置过,但是有三方库,不排除有可能哪里设置了。因此通过pthread_setaffinity_np在主线程中设置亲和性(了解到子线程会继承的),但是不起效果,有继续翻博客,发现还有进程亲和性的设置函数,想着是不是设置主线程不行,应该设置进程呢,于是用sched_setaffinity来设置(见本博客开头的插图中的代码)发现可以了。另外在设置前后还特意查看亲和性(sched_getaffinity),确认设置成功。
【其他参考】
查看某个进程线程数
ps -T -p pid
查看特定某个进程线程使用内存情况
top -H -p pid