1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 4 // 使用4个线程
// 线程参数结构体
typedef struct {
int *arr;
int start;
int end;
int *sum;
pthread_mutex_t *mutex;
} ThreadData;
void* thread_sum(void *arg) {
ThreadData *data = (ThreadData *)arg;
int partial_sum = 0;
for (int i = data->start; i < data->end; ++i) {
partial_sum += data->arr[i];
}
// 使用互斥锁保护共享资源sum
pthread_mutex_lock(data->mutex);
*data->sum += partial_sum;
pthread_mutex_unlock(data->mutex);
return NULL;
}
int sum_array(int *arr, int len, int *sum, pthread_mutex_t *sum_mutex) {
pthread_t threads[NUM_THREADS];
ThreadData thread_data[NUM_THREADS];
int chunk_size = len / NUM_THREADS;
// 创建线程
for (int i = 0; i < NUM_THREADS; ++i) {
thread_data[i].arr = arr;
thread_data[i].start = i * chunk_size;
thread_data[i].end = (i == NUM_THREADS - 1) ? len : (i + 1) * chunk_size; // 最后一个线程处理剩余部分
thread_data[i].sum = sum;
thread_data[i].mutex = sum_mutex;
pthread_create(&threads[i], NULL, thread_sum, (void*)&thread_data[i]);
}
// 等待所有线程完成
for (int i = 0; i < NUM_THREADS; ++i) {
pthread_join(threads[i], NULL);
}
return *sum;
}
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 示例数组
int len = sizeof(arr) / sizeof(arr[0]);
int sum = 0; // 用于存储总和
pthread_mutex_t sum_mutex; // 互斥锁
pthread_mutex_init(&sum_mutex, NULL);
// 调用sum_array进行求和
int result = sum_array(arr, len, &sum, &sum_mutex);
pthread_mutex_destroy(&sum_mutex);
printf("Sum of array: %d\n", result);
return 0;
}
|