有人可以向我解释这段代码的逻辑吗?
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_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]
。
- 第4次调用
sum_array
,thread_part
为3
,sum_array
会将元素[75,100)求和为sum[3]
.
只要对 sum_array
的调用是连续的,以上内容就是正确的。但是,我假设 sum_array
被四个同时 运行 线程中的每一个调用一次。因为 part++
不是线程安全的,thread_part
不能保证在每个线程中都是不同的,所以它不会像上面描述的那样很好地工作。
为了达到预期的结果,您需要使 part++
原子化(例如使用锁)。更好的是,将 thread_part
作为参数传递给线程。
请注意 MAX
必须能被 4
整除,否则元素不会相加。
我在练习多线程,在网上找问题。但是我无法理解这段代码背后的逻辑。
代码创建了 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_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]
。 - 第4次调用
sum_array
,thread_part
为3
,sum_array
会将元素[75,100)求和为sum[3]
.
只要对 sum_array
的调用是连续的,以上内容就是正确的。但是,我假设 sum_array
被四个同时 运行 线程中的每一个调用一次。因为 part++
不是线程安全的,thread_part
不能保证在每个线程中都是不同的,所以它不会像上面描述的那样很好地工作。
为了达到预期的结果,您需要使 part++
原子化(例如使用锁)。更好的是,将 thread_part
作为参数传递给线程。
请注意 MAX
必须能被 4
整除,否则元素不会相加。