どのようにスケールアップするかをテストするために、次の非常に単純な pthread コードを作成しました。8 つの論理プロセッサを搭載したマシンでコードを実行していますが、8 つを超えるスレッドを作成することはありません (コンテキストの切り替えを避けるため)。スレッドの数が増えると、各スレッドが実行する作業量が少なくなります。また、コードから明らかなように、スレッド間でボトルネックになる可能性のある共有データ構造はありません。それでも、スレッド数を増やすとパフォーマンスが低下します。誰かが私がここで間違っていることを教えてもらえますか?
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int NUM_THREADS = 3;
unsigned long int COUNTER = 10000000000000;
unsigned long int LOOP_INDEX;
void* addNum(void *data)
{
unsigned long int sum = 0;
for(unsigned long int i = 0; i < LOOP_INDEX; i++) {
sum += 100;
}
return NULL;
}
int main(int argc, char** argv)
{
NUM_THREADS = atoi(argv[1]);
pthread_t *threads = (pthread_t*)malloc(sizeof(pthread_t) * NUM_THREADS);
int rc;
clock_t start, diff;
LOOP_INDEX = COUNTER/NUM_THREADS;
start = clock();
for (int t = 0; t < NUM_THREADS; t++) {
rc = pthread_create((threads + t), NULL, addNum, NULL);
if (rc) {
printf("ERROR; return code from pthread_create() is %d", rc);
exit(-1);
}
}
void *status;
for (int t = 0; t < NUM_THREADS; t++) {
rc = pthread_join(threads[t], &status);
}
diff = clock() - start;
int sec = diff / CLOCKS_PER_SEC;
printf("%d",sec);
}
注:私がオンラインで見つけたすべての回答は、スレッドを作成するオーバーヘッドは、スレッドが行っている作業よりも大きいと述べています。テストするために、「addNum()」関数内のすべてをコメントアウトしました。しかし、その後、スレッドをいくつ作成しても、コードの所要時間は 0 秒です。したがって、オーバーヘッドはないと思います。