我正在练习多线程并在线寻找问题。但是我无法理解这段代码背后的逻辑。
代码创建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];
}
答案 0 :(得分:1)
每次调用sum_array
时,对元素thread_part * (MAX / 4)
(包括)至(thread_part + 1) * (MAX / 4)
(不包括)进行求和。
sum_array
,thread_part
是0
,并且sum_array
会将元素[0,25)加到sum[0]
中。sum_array
,thread_part
是1
,并且sum_array
将元素[25,50)加到sum[1]
中。sum_array
,thread_part
是2
,并且sum_array
会将元素[50,75)加到sum[2]
中。sum_array
,thread_part
是3
,并且sum_array
会将元素[75,100)加到sum[3]
中。只要对sum_array
的调用是连续的,上述内容就是正确的。但是,我假设sum_array
被四个同时运行的线程中的每个线程调用一次。由于part++
不是线程安全的,因此不能保证thread_part
在每个线程中都是不同的,因此它不能像上述那样很好地工作。
要获得所需的结果,您需要使part++
成为原子的(例如,使用锁)。更好的是,将thread_part
作为参数传递给线程。
请注意,MAX
必须能被4
整除,否则将不会对元素求和。