c - 为什么在 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 秒。我必须使用多线程来使程序更快,但恰恰相反。谁能解释为什么?
解决方案
您使用锁来确保sum += (pow(-1, i) / ((2 * i) + 1));
一次只在一个线程中计算。只有当多个线程同时工作时,多线程可能会更快。
互斥锁和线程创建本身成本很高,这就是为什么多线程非并行程序比单线程程序慢的原因。
您提出的解决方案是什么?
没有共享资源。在这种情况下,每个线程都有单独的总和,然后在最后求和。分而治之。
推荐阅读
- typescript - 如何使用嵌套导航在屏幕之间移动数据?
- mongodb - Mongodb:如何向数组中的每个文档添加一个字段,其值是根据每个文档中的其他两个字段计算得出的?
- php - 无法让 PCOV 使用 Xampp 在 Windows 上进行手动测试
- ios - CGColor数组的问题
- spring-batch - 如何使用 Spring Cloud Dataflow 启动 Spring Batch 远程分区
- python - 将每个 json 项转换为 pandas 数据框列中的 json 对象
- r - 试图同时做几个情节
- angular - Angular:您在预期流的位置提供了“未定义”
- c# - Xamarin.Forms.Maps iOS 模拟器上的自定义 pin 加载,但不是物理设备
- bash - 在 bash 单行中将二进制数据分成几行?