📌  相关文章
📜  使用pthreads的数组的总和(1)

📅  最后修改于: 2023-12-03 14:49:49.461000             🧑  作者: Mango

使用pthreads的数组总和介绍

在多线程编程中,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;
}
代码解析
  1. 代码中使用了pthread_mutex_t类型的mutex来保护共享变量sum,防止多个线程同时访问和修改。
  2. calculateSum函数被多个线程并发执行,每个线程都计算一部分数组元素的和,并加到partial_sum中。
  3. 计算出来的partial_sum最终会被加到共享变量sum上,需要先加锁进行保护,然后再解锁,以确保线程安全。
  4. main函数中首先初始化数组array,然后初始化互斥锁mutex
  5. 然后创建多个线程,每个线程执行calculateSum函数来计算数组的总和。
  6. 最后等待所有线程执行完毕,销毁互斥锁,并打印出最终的数组总和。
运行结果

运行以上代码,输出结果为:

Sum: 500000500000
总结

使用pthreads库可以方便地实现多线程编程。在本示例中,我们使用pthreads库计算了一个数组的总和,通过互斥锁保护共享变量,确保线程安全。使用多线程可以提高计算效率,特别是在处理大量数据的情况下。