首页 > 解决方案 > 为什么在 C 中 2 个线程的执行比 1 个线程的执行慢?

问题描述

我正在使用该pthread库制作一个程序,以使用莱布尼茨公式找到 pi 的准确值。我正在这里处理共享资源。我的多线程函数如下所示:

void *Leibniz(void *vars)
{
    struct variables *val = (struct variables *)vars;
    int startLimit = val->start;
    int endLimit = val->end;
    
    int i;
    for (i = startLimit; i <= endLimit; i++)
    {
        pthread_mutex_lock(&mutex);
        sum += (pow(-1, i) / ((2 * i) + 1));
        pthread_mutex_unlock(&mutex);
    }
}

当我使用N迭代和 1 个线程运行程序时,我平均在大约 4.5 秒内得到正确的输出。当我用两个线程运行同一个程序时,大约需要 18 秒。我必须使用多线程来使程序更快,但恰恰相反。谁能解释为什么?

标签: cmultithreadingpthreads

解决方案


您使用锁来确保sum += (pow(-1, i) / ((2 * i) + 1));一次只在一个线程中计算。只有当多个线程同时工作时,多线程可能会更快。

互斥锁和线程创建本身成本很高,这就是为什么多线程非并行程序比单线程程序慢的原因。

您提出的解决方案是什么?

没有共享资源。在这种情况下,每个线程都有单独的总和,然后在最后求和。分而治之。


推荐阅读