在C語言中,可以使用多線程實現并行計算。下面是一個簡單的示例代碼,展示了如何使用多線程進行并行計算:
#include <stdio.h>
#include <pthread.h>
#define THREADS_COUNT 4
#define ARRAY_SIZE 1000000
int array[ARRAY_SIZE];
int sum = 0;
// 線程函數,用于計算數組的部分和
void* calculateSum(void* arg) {
int thread_id = *(int*)arg;
int start = thread_id * (ARRAY_SIZE / THREADS_COUNT);
int end = start + (ARRAY_SIZE / THREADS_COUNT);
for (int i = start; i < end; i++) {
sum += array[i];
}
return NULL;
}
int main() {
// 初始化數組
for (int i = 0; i < ARRAY_SIZE; i++) {
array[i] = i;
}
pthread_t threads[THREADS_COUNT];
int thread_ids[THREADS_COUNT];
// 創建多個線程,每個線程負責計算數組的一部分
for (int i = 0; i < THREADS_COUNT; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, calculateSum, &thread_ids[i]);
}
// 等待所有線程執行完畢
for (int i = 0; i < THREADS_COUNT; i++) {
pthread_join(threads[i], NULL);
}
printf("Sum: %d\n", sum);
return 0;
}
在上面的代碼中,我們定義了一個包含一百萬個元素的整數數組array
,然后創建了四個線程,每個線程計算數組的一個部分和。最后,將計算得到的部分和相加得到最終結果,并輸出。
請注意,在并行計算中,為了保證線程安全,我們使用了互斥鎖(mutex)來防止多個線程同時修改sum
變量,以避免競爭條件。在這個簡單的示例中,使用互斥鎖并不是必需的,因為每個線程計算的部分是不重疊的,不會同時訪問相同的內存位置。但在更復雜的并行計算中,可能需要使用互斥鎖來確保數據的一致性。
另外,需要注意的是,多線程并不一定會提高程序的性能,因為多個線程之間的切換和同步開銷可能會超過并行計算帶來的性能提升。因此,在使用多線程進行并行計算時,需要根據具體的應用場景進行評估和優化。