gpt4 book ai didi

有人可以向我解释这段代码的逻辑吗?

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

我正在练习多线程,并在网上寻找问题。但我无法理解这段代码背后的逻辑。

该代码创建 4 个线程并对数组的 1/4 部分求和。我知道如何创建线程,但无法理解 sum 函数。

#include <pthread.h> 
#include <stdio.h>
// size of array
#define MAX 100

// maximum number of threads
#define MAX_THREAD 4

int fill_array[100];
int sum[4] = { 0 };
int part = 0;

void* sum_array(void* arg)
{
int i=0;
// Each thread computes sum of 1/4th of array
int thread_part = part++;

for ( i = thread_part * (MAX / 4); i < (thread_part + 1) * (MAX / 4); i++)
sum[thread_part] += fill_array[i];
}

最佳答案

每次调用 sum_array 时,元素 thread_part * (MAX/4)(含)到 (thread_part + 1) * (MAX/4) (独占)相加。

  • 第一次调用 sum_array 时,thread_part0sum_array 将对元素 [0, 25) 进入 sum[0]
  • 第二次调用 sum_array 时,thread_part1sum_array 将对元素 [25, 50)转化为sum[1]
  • 第三次调用 sum_array 时,thread_part2sum_array 将对元素 [50, 75) 进入sum[2]
  • 第四次调用 sum_array 时,thread_part3sum_array 将对元素求和 [75,100)进入sum[3]

只要对 sum_array 的调用是连续的,上述情况就成立。但是,我认为 sum_array 被四个同时运行的线程中的每一个调用一次。由于 part++ 不是线程安全的,因此不能保证 thread_part 在每个线程中都不同,因此它不会像上面描述的那样很好地工作。

为了达到预期的结果,您需要使 part++ 原子化(例如使用锁)。更好的是,将 thread_part 作为参数传递给线程。

请注意,MAX 必须能被 4 整除,否则元素将不会被求和。

关于有人可以向我解释这段代码的逻辑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58705789/

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