操作系统实践(七)
??實驗到此,正式進入線程部分。本次實驗課的主要內容是線程的建立(pthread_create)和同步(pthread_join)。下面對內容進行下介紹:
線程建立
??為什么要有一個線程參數呢? 在多線程情況下,每個線程執行的任務差不多。但是輸入參數不同。不使用線程參數的話,要為每一個線程寫一個執行函數。這樣代碼重復性很大,通過設置參數,提供不同的參數來實現代碼復用。根據需要,三種類型可選。
線程等待
??這里解釋下為什么要有線程的返回值:如果不設置返回值的話就要用全局變量去保存每個線程的結果,不太方便。直接用返回值存儲,比較方便。
??作業的話就是對于線程的創建同步的使用,題目如下:
注意:對于線程編譯的時候不能簡單的gcc pi1.c,否則會報錯,像這樣:
必須:gcc pi1.c -lpthread
??代碼如下:
??代碼如下:
#include<stdlib.h> #include<stdio.h> #include<pthread.h>#define NUMBER 30000 #define CPU_NUM 2 #define CHILD (NUMBER/CPU_NUM)struct param {int start;int end; };struct result {double sum; };void *compute(void *arg) {struct param *param;struct result *result;double sum = 0;param = (struct param *)arg; // 參數都是void *,要轉成對應的類型for (int i=param->start; i<param->end; i++) {if (i % 2 == 0) {sum += 1.0/(2*i+1);}else {sum -= 1.0/(2*i+1);}}result = malloc(sizeof(struct result));result->sum = sum;return result; }int main() {pthread_t son[CPU_NUM]; struct param params[CPU_NUM]; // 必須要申請,否則段錯誤for (int i=0; i<CPU_NUM; i++) {// param不可作為臨時變量,都必須是params的地址struct param *param; param = ¶ms[i];param->start = i*CHILD;param->end = (i+1)*CHILD;pthread_create(&son[i], NULL, compute, param);}double sum = 0;for (int i=0; i<CPU_NUM; i++) {struct result *result;pthread_join(son[i], (void **)&result);sum += result->sum;free(result); // 用完一定要釋放}printf("ending is %lf\n", 4*sum);return 0; }??兩個代碼經過檢驗,結果都是正確的(在誤差允許范圍內)!
??又一次實驗課,繼續加油吧!
總結
- 上一篇: python制作简单K线图
- 下一篇: 11. OD-Delphi程序暴力破解