gpt4 book ai didi

您可以在同一函数中使用具有不同键的多个互斥锁/解锁来计算数据结构中的平均值吗?

转载 作者:行者123 更新时间:2023-11-30 14:53:11 25 4
gpt4 key购买 nike

假设我想计算大小为 N 的数组 X 中的值的平均值。假设我们使用 T 个线程,其中 T 是 N 的一部分,因此我们是多线程。

是否可以声明两个唯一的互斥锁键并执行以下命令而不会出现错误?

编辑:关于如何计算平均值、最大值、最小值等的任何想法?

见下文:

#include <stdio.h>
#include <pthread.h>

void* sum(void* arg);

int sum = 0;
int average = 0;

int x[N];

int main()
{
int i;
pthread_t threads[T];

for(i=0; i<T; i++)
pthread_create(&x[i], NULL, sum, (void *)i);
for(i=0; i<T; i++)
pthread_join(x[i], NULL);
}

void* sum(void* arg)
{
int counter = 0;
int *id = (int *) arg;

pthread_mutex_t key1;
pthread_mutex_t key2;

int size = N/T;
int start = id * size;
int end = id * size + size;

for(i=start; i<end; i++)
{
counter = counter + x[i];
}

pthread_mutex_lock(&key1);
sum += counter;
pthread_mutex_unlock(&key1);

pthread_mutex_lock(&key2);
average = sum / counter;
pthread_mutex_lock(&key2);

return NULL;
}

最佳答案

不,这是一场灾难。每个线程都会调用 sum 并且它们都会获得自己的互斥锁。这意味着一个线程可以在另一个线程锁定其 key2 的同时锁定其 key2。因此两个线程可以同时访问average

您需要且仅需要一个互斥体来保护平均。否则,它实际上并没有受到保护。

(此外,您还有一个名为 sum 的函数和全局变量。这会导致痛苦和困惑。)

您还有另一个问题。每个线程都获取共享的总和,并将其除以其私有(private)的计数器。这根本没有任何意义。 sum 变量需要除以它求和的条目总数以获得平均值,而不是该特定线程添加的条目数。

我建议进行两项更改:

  1. 只有一个互斥体。使其成为全局性的。
  2. 不要让 sum 函数接触 average 变量。加入所有线程后,只需执行 average = sum/N; 即可。

关于您可以在同一函数中使用具有不同键的多个互斥锁/解锁来计算数据结构中的平均值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47344354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com