📅  最后修改于: 2023-12-03 15:22:19.479000             🧑  作者: Mango
在处理大型数组时,通常需要使用多线程以提高处理速度。本文介绍了如何使用pthread库在大型数组中查找最大元素。
本程序使用两个线程同时遍历数组寻找最大元素。其中一个线程查找数组的前半段,另一个线程查找数组的后半段。最终将两个线程中找到的最大值进行比较得到最终最大元素。
代码中定义数组大小为100,000,000(1亿),类型为int。程序中使用rand函数随机生成数组元素。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100000000 // 数组大小
#define THREADS 2 // 线程数
int* array;
int maximum = 0;
pthread_mutex_t lock;
void* max(void* arg) {
int id = (int)arg;
int start = id * (SIZE / THREADS);
int end = start + (SIZE / THREADS);
int local_max = 0;
for (int i = start; i < end; i++) {
if (array[i] > local_max) {
local_max = array[i];
}
}
pthread_mutex_lock(&lock);
if (local_max > maximum) {
maximum = local_max;
}
pthread_mutex_unlock(&lock);
return NULL;
}
int main() {
array = malloc(sizeof(int) * SIZE);
for (int i = 0; i < SIZE; i++) {
array[i] = rand();
}
pthread_t threads[THREADS];
pthread_mutex_init(&lock, NULL);
for (int i = 0; i < THREADS; i++) {
pthread_create(&threads[i], NULL, max, (void*)i);
}
for (int i = 0; i < THREADS; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&lock);
printf("Maximum Element: %d\n", maximum);
return 0;
}
首先通过宏定义定义了数组大小和线程数。接着定义了全局变量int* array
,存放生成的随机数组,用int maximum
保存最大值。定义了互斥锁变量pthread_mutex_t lock
来保证多线程对最大值的访问不会导致竞争(Race Condition)。
接下来,定义了函数void* max(void* arg)
,该函数为线程函数。线程首先根据线程id计算出本线程遍历数组的起始位置和结束位置,然后遍历该范围内的元素,每次比较元素值是否比当前最大值大,如果是则更新local_max
变量。最后,线程锁定互斥锁变量,比较自己找到的最大值是否比全局最大值maximum
大,如果是则更新全局最大值变量,解锁互斥锁变量。
在main
函数中,先分配SIZE
大小的内存,通过for
循环为数组元素随机赋值。接着定义数组threads
存放创建的线程。然后初始化互斥锁变量。通过for
循环创建多线程,每个线程的线程函数为max
。然后调用pthread_join
等待线程运行结束,并进行互斥锁变量的销毁。最后输出查找到的最大元素值。
本文介绍了如何使用pthread库在大型数组中查找最大元素。使用多线程进行并行处理,可以提高处理速度,适用于对大型数据集进行计算处理、并行搜索等场景。同时需要注意线程之间的同步问题,如互斥访问共享变量等。