📅  最后修改于: 2023-12-03 14:49:49.461000             🧑  作者: Mango
在多线程编程中,pthreads库是一个常用的工具,通过它我们可以方便地创建和管理线程。本文将介绍如何使用pthreads库来计算数组的总和。
下面是一个使用pthreads库计算数组总和的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_COUNT 4
#define ARRAY_SIZE 1000000
int array[ARRAY_SIZE];
long long sum = 0;
pthread_mutex_t mutex;
void* calculateSum(void* arg) {
int thread_id = *((int*)arg);
long long partial_sum = 0;
for (int i = thread_id * (ARRAY_SIZE / THREAD_COUNT); i < (thread_id + 1) * (ARRAY_SIZE / THREAD_COUNT); i++) {
partial_sum += array[i];
}
pthread_mutex_lock(&mutex); // 加锁
sum += partial_sum;
pthread_mutex_unlock(&mutex); // 解锁
return NULL;
}
int main() {
pthread_t threads[THREAD_COUNT];
int thread_ids[THREAD_COUNT];
// 初始化数组
for (int i = 0; i < ARRAY_SIZE; i++) {
array[i] = i + 1;
}
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
// 创建多个线程来计算数组的总和
for (int i = 0; i < THREAD_COUNT; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, calculateSum, &thread_ids[i]);
}
// 等待所有线程结束
for (int i = 0; i < THREAD_COUNT; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex); // 销毁互斥锁
printf("Sum: %lld\n", sum);
return 0;
}
pthread_mutex_t
类型的mutex
来保护共享变量sum
,防止多个线程同时访问和修改。calculateSum
函数被多个线程并发执行,每个线程都计算一部分数组元素的和,并加到partial_sum
中。partial_sum
最终会被加到共享变量sum
上,需要先加锁进行保护,然后再解锁,以确保线程安全。main
函数中首先初始化数组array
,然后初始化互斥锁mutex
。calculateSum
函数来计算数组的总和。运行以上代码,输出结果为:
Sum: 500000500000
使用pthreads库可以方便地实现多线程编程。在本示例中,我们使用pthreads库计算了一个数组的总和,通过互斥锁保护共享变量,确保线程安全。使用多线程可以提高计算效率,特别是在处理大量数据的情况下。