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 例 頁面排...