この再帰的なマルチスレッド プログラムを考えてみましょう:
#include <iostream>
#include <thread>
#define NUMTHREADS 4
using namespace std;
int g[NUMTHREADS];
thread t[NUMTHREADS];
void task1(int x)
{
if(x+1<NUMTHREADS)
t[x] = thread(task1, x+1);
for(int i=0;i<100000000;i++)
g[x]++;
if(x+1<NUMTHREADS)
t[x].join();
}
int main()
{
task1(0);
for(int i=0;i<NUMTHREADS;i++)
cout<<g[i]<<" ";
}
スレッドのオーバーヘッドはわずかであると予想していますが、実際には、プログラムの実行時間はスレッドの数に比例して増加します。
私の6コアCPUでのタイミングは次のとおりです。
スレッド数 = 1:
$ time ./a
100000000
real 0m0.330s
user 0m0.312s
sys 0m0.015s
スレッド数 = 2:
$ time ./a
100000000 100000000
real 0m0.742s
user 0m1.404s
sys 0m0.015s
スレッド数 = 3:
$ time ./a
100000000 100000000 100000000
real 0m1.038s
user 0m2.792s
sys 0m0.000s
スレッド数 = 4:
$ time ./a
100000000 100000000 100000000 100000000
real 0m1.511s
user 0m5.616s
sys 0m0.015s
なぜこれが考えられるのでしょうか?