大部分情况下,使用N个线程的速度并不是等量任务单线程的1/N,这里面有很多原因,比如创建线程、线程调度的开销,CPU/核的数量不够多导致N个任务不能完全并行,再或者,其它非任务线程占用CPU。
还有一个不容忽视的原因就是,多个线程更新同一个cache line,导致多个核的缓存同步占用了大量时间。
这是一种隐藏地很深的原因,比如下面我遇到的情况:
首先是一个单线程程序:
#include <stdio.h>
#include <stdlib.h>
unsigned long iteration = 20000000000;
unsigned long* data_array;
int main() {
data_array = (unsigned long*)malloc(sizeof(unsigned long)*1);
*data_array = 0;
while (*data_array < iteration)
(*data_array)++;
free(data_array);
}
它计算20000000000次,它的耗时:
yxc@RealBox:~/Desktop/test$ time ./single
real 0m39.234s
user 0m39.178s
sys 0m0.000s
然后是一个两个线程的多线程版本,每个线程执行1 0000000000计算: