我编写了以下非常简单的 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 秒。所以我认为没有这样的开销。