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

Can someone explain this code's logic to me?

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

代码创建了 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_arraythread_part0sum_array会将元素[0,25)求和为sum[0]
  • 第二次调用sum_arraythread_part1sum_array会将元素[25,50)求和为sum[1]
  • 第三次调用sum_arraythread_part2sum_array会将元素[50,75)求和为sum[2]
  • 第4次调用sum_arraythread_part3sum_array会将元素[75,100)求和为sum[3].

只要对 sum_array 的调用是连续的,以上内容就是正确的。但是,我假设 sum_array 被四个同时 运行 线程中的每一个调用一次。因为 part++ 不是线程安全的,thread_part 不能保证在每个线程中都是不同的,所以它不会像上面描述的那样很好地工作。

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

请注意 MAX 必须能被 4 整除,否则元素不会相加。