我用C编写了一个程序,它有两个线程。 最初它是,
for(int i=0;i<n;i++){
long_operation(arr[i]);
}
然后我将循环划分为两个线程,两个并发执行。
一个线程将执行arr [0]到arr [n / 2]的操作,另一个线程将用于arr [n / 2]到arr [n-1]。
long_operation函数是线程安全的。
最初我使用的是连接,但futex系统调用需要更长的系统时间,我使用strace命令观察到。
所以我删除了strace命令并在两个线程中使用两个volatile变量来跟踪线程是否完成以及线程spawing函数中的busy循环两个停止执行后面的代码。我让线程可拆卸并删除了连接。
它稍微改善了性能。但是当我使用时间命令时,系统部分正在进行,
real 0m31.368s
user 0m53.738s
sys 0m15.203s
但是当我使用strace命令检查输出时,
% time seconds usecs/call calls errors syscall
55.79 0.000602 9 66 clone
44.21 0.000477 3 177 write
------ ----------- ----------- --------- --------- ---------------
100.00 0.001079 243 total
因此,time命令显示CPU在内核中花费大约15秒的时间。但显示几乎0秒的strace命令用于系统调用。
那为什么内核浪费了15秒呢? 我有一个双核超线程Intel CPU。