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

时间:2019-11-05 06:42:06

标签: c pthreads

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

代码创建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]; 
} 

1 个答案:

答案 0 :(得分:1)

每次调用sum_array时,对元素thread_part * (MAX / 4)(包括)至(thread_part + 1) * (MAX / 4)(不包括)进行求和。

  • 第一次调用sum_arraythread_part0,并且sum_array会将元素[0,25)加到sum[0]中。
  • 第二次调用sum_arraythread_part1,并且sum_array将元素[25,50)加到sum[1]中。
  • 第三次调用sum_arraythread_part2,并且sum_array会将元素[50,75)加到sum[2]中。
  • 第四次调用sum_arraythread_part3,并且sum_array会将元素[75,100)加到sum[3]中。

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

要获得所需的结果,您需要使part++成为原子的(例如,使用锁)。更好的是,将thread_part作为参数传递给线程。

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