为什么多线程比单线程慢?? (Linux,C,使用 pthread)

Why MultiThread is slower than Single?? (Linux,C,using pthread)

我对多线程有疑问。 这段代码是关于比较单线程和多线程的简单示例。 (单线程与 4 多线程的总和为 0~400,000,000)

//Single
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

#define NUM_THREAD 4
#define MY_NUM 100000000

void* calcThread(void* param);
double total = 0;
double sum[NUM_THREAD] = { 0, };
int main() {
    long p[NUM_THREAD] = {MY_NUM, MY_NUM * 2,MY_NUM * 3,MY_NUM * 4 };
    int i;
    long total_nstime;
    struct timespec begin, end;
    pthread_t tid[NUM_THREAD];
    pthread_attr_t attr[NUM_THREAD];
    clock_gettime(CLOCK_MONOTONIC, &begin);
    for (i = 0; i < NUM_THREAD; i++) {
        calcThread((void*)p[i]);
    }
    for (i = 0; i < NUM_THREAD; i++) {
        total += sum[i];
    }
    clock_gettime(CLOCK_MONOTONIC, &end);
    printf("total = %lf\n", total);
    total_nstime = (end.tv_sec - begin.tv_sec) * 1000000000 + (end.tv_nsec -    begin.tv_nsec);
    printf("%.3fs\n", (float)total_nstime / 1000000000);
    return 0;
}
void* calcThread(void* param) {
    int i;
    long to = (long)(param);
    int from = to - MY_NUM + 1;
    int th_num = from / MY_NUM;
    for (i = from; i <= to; i++)
        sum[th_num] += i;
    }

我想更改使用 4-MultiThread 代码,所以我将计算函数更改为使用 MultiThread。

...
int main() {
    ...
    //createThread
    for (i = 0; i < NUM_THREAD; i++) {
        pthread_attr_init(&attr[i]);
        pthread_create(&tid[i],&attr[i],calcThread,(void *)p[i]);
    }
    //wait
    for(i=0;i<NUM_THREAD;i++){
        pthread_join(tid[i],NULL);
    }
    for (i = 0; i < NUM_THREAD; i++) {
        total += sum[i];
    }   
    clock_gettime(CLOCK_MONOTONIC, &end);
    ...
}

Result(in Ubuntu) 但是,它比单功能代码慢。我知道多线程更快。 我不知道这个问题:( 怎么了? 你能给我一些建议吗?非常感谢!

"I know MultiThread is faster"

情况并非总是如此,因为通常您会 CPU 以某种方式受到限制,无论是由于核心数量,它是如何在 OS 级别安排的,以及硬件水平。

这是一个平衡,多少线程值得分配给一个进程,因为您可能 运行 遇到一个旧的 Linux 问题,在该问题中您将花费比实际更多的时间来安排进程 运行宁他们。

因为这是非常依赖硬件的,并且 OS 依赖,所以很难确切地说出问题可能是什么,但请确保您为 CPU 安装了适当的微码(通常由默认为 Ubuntu),但以防万一,请尝试:

sudo apt-get install intel-microcode 

否则看看其他进程正在运行什么 运行,可能有很多其他进程正在 运行正在分配给进程的内核上。