C語言實現並行求和演算法

2021-06-27 09:29:25 字數 1357 閱讀 8037

1、問題描述

將陣列a均勻劃分成m個片段,每個陣列片段最多有(n+m-1)/m 個元素。每個陣列片段分別由乙個執行緒負責區域性求和,最後這些部分和加起來就得到陣列中所有元素的總和。

2、相關**

此**在gcc4.3下編譯通過

#include

#include

#include

#define num_threads 4

int n;

int *x;

int gsum[num_threads];

void* summation(void *parg)

void initarr()

}int main(void)

for(j=0;j

pthread_join(thandles[j],null);

sum+= gsum[j];

}printf("the sum of array elements is %d\n",sum);

return 0;}

3、技術難點

1)動態陣列初始化

c語言中不允許動態陣列型別。例如: int n;scanf("%d",&n);int a[n]; 用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。

這裡使用malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別

void* 表示未確定型別的指標。c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。

2)void型別轉換

malloc返回型別是 void* 型別

這並不是說該函式呼叫後無返回值,而是返回乙個結點的位址,該位址的型別為void,即一段儲存區的首址,其具體型別無法確定,只有使用時根據各個域值資料再確定。可以用強轉的方法將其轉換為別的型別。例如:

int *pd=null;

pi=(int *)malloc(n*sizeof(int));

向系統申請10個連續的int型別的儲存空間,用指標pi指向這個連續的空間的首位址。

並且用(int*)對malloc的返回型別進行轉換,以便把int型別資料的位址賦值給指標pi

3)主線程等待子執行緒結束

對於多執行緒而言,乙個主要的難題就是如何執行緒是否都已經執行結束。這裡用的方法是pthread_join

pthread_join方法的功能就是等待執行緒結束

syntax: int pthread_join(pthread_t thread, void **retval);

第乙個引數,執行緒id,就是要等待的執行緒id

第二個引數用來接受執行緒函式的返回值,如果沒有返回值,就直接設為null。

Go語言實現並行分段求和計算

這個例項通過迴圈實現並行的分段求和計算,再把各個子段和加到總和中。通過這個例項可以了解如何實現迴圈並行處理,以及有關的程式設計技巧。但是這個程式是有問題的,因為可能發生變數訪問衝突問題,導致計算結果不正確。這個程式是不穩定的,有時能夠計算出不正確的結果,有時能夠計算出正確結果。程式中的變數sum是共...

c語言實現磁碟排程演算法 C語言實現洗牌演算法

首先看一道題目 有乙個大小為100的陣列,裡面的元素是從 1 到 100,隨機從陣列中選擇50個不重複數。用math.random 100,就可以拿到乙個 0 到 99 的隨機數,是不是重複50次就可以了?當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出...

lfu演算法實現c語言 lru演算法c語言實現

a 分配頁面 b 置換演算法 c 程式訪問 d 換出頁面 正確答案 d 單選題 22.設某程序的頁訪問串為 1 3 1 2 4,工作集為 3 塊,問 按 lru 頁面替換演算法,儲存管理採取虛擬儲存技術 組成 物理記憶體 主機板上的ram 和硬碟上的 虛擬記憶體聯合組成 頁面大小 4kb 例 頁面排...