操作系統實驗五線程間的互斥與同步_第1頁
操作系統實驗五線程間的互斥與同步_第2頁
操作系統實驗五線程間的互斥與同步_第3頁
操作系統實驗五線程間的互斥與同步_第4頁
操作系統實驗五線程間的互斥與同步_第5頁
已閱讀5頁,還剩1頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、word實驗 五 線程間的互斥與同步實驗學時:2學時實驗類型:驗證、設計型一、實驗目的 理解POSIX線程Pthread互斥鎖和POSIX信號量機制,學習它們的使用方法;編寫程序,實現多個POSIX線程的同步控制。二,實驗內容 創立4個POSIX線程。其中2個線程(A和B)分別從2個數據文件(data1.txt和data2.txt)讀取10個整數. 線程A和B把從文件中讀取的逐一整數放入一個緩沖池. 緩沖池由n個緩沖區構成n=5,并可以方便地調整為其他值,每個緩沖區可以存放一個整數。另外2個線程,C和D,各從緩沖池讀取10數據。線程C、D每讀出2個數據,分別求出它們的和或乘積,并打印輸出。提示

2、:在創立4個線程當中,A和B是生產者,負責從文件讀取數據到公共的緩沖區,C和D是消費者,從緩沖區讀取數據然后作不同的計算加和乘運算。使用互斥鎖和信號量控制這些線程的同步。不限制線程C和D從緩沖區得到的數據來自哪個文件。在開始設計和實現之前,務必認真閱讀課本6.8.4節和第6章后面的編程工程生產者-消費者問題。 三,實驗要求按照要求編寫程序,放在相應的目錄中,編譯成功后執行,并按照要求分析執行結果,并寫出實驗報告。四,實驗設計1,功能設計根據實驗要求,主程序需要創立四個線程,兩個線程負責從文件讀取數據到緩沖區,兩個線程負責將緩沖區的數據做數學運算。由于同一個進程中的各個線程共享資源,可以用一個二

3、維數組的全局變量作為公共緩沖區,同時還需要一個整形全局變量size用來做數組的索引。讀線程的運行函數翻開不同的文件并從中讀取數據到二維數組中,每次寫入數組后size加一。運算線程從二維數組中讀數并做運算,每次讀數之前size減一。此題的關鍵在于如何使用信號量保證進程的同步與互斥。在運算線程從緩沖區讀取之前緩沖區里必須有數,即任意時刻運算操作的執行次數必須小于等于讀取操作的執行次數。同時應該保證兩個讀線程和兩個運算線程兩兩互斥。由于以上分析,使用了四個信號量sem1,sem2,sem3和sem4。sem1保證線程1和線程2互斥,sem2保證線程3和線程4互斥,sem3保證線程3和線程4互斥,se

4、m4保證線程4和線程1互斥。即這四個信號量使四個線程循環進行,從而保證了運行結果的正確性。源代碼及注釋:#include <stdio.h>#include <pthread.h>#include <semaphore.h>#define NUM 200int stackNUM2;/公共緩沖區int size=0;/初始化數組索引sem_t sem1,sem2,sem3,sem4;/定義四個信號量void read1(void)/線程運行函數,負責從文件讀取數據FILE *fp=fopen("data0.txt","r"

5、;);/以只讀方式翻開文件data1while(!feof(fp)sem_wait(&sem1);/減少信號量sem1if(!fscanf(fp,"%d %d",&stacksize0,&stacksize1)return;size+;/讀兩個數到公共緩沖區sem_post(&sem2);/增加信號量sem2fclose(fp);/關閉文件void read2(void)/線程運行函數,負責從文件讀取數據FILE *fp=fopen("data1.txt","r");/以只讀方式翻開文件data2whi

6、le(!feof(fp)sem_wait(&sem2);/減少信號量sem2if(!fscanf(fp,"%d %d",&stacksize0,&stacksize1)return;size+;/讀兩個數到公共緩沖區sem_post(&sem3);/增加信號量sem3fclose(fp);void plus1(void)/線程運行函數,負責加運算while(1)sem_wait(&sem3);/減少信號量sem3if(size=0)return;size-;printf("Plus:%d+%d=%dn",stack

7、size0,stacksize1,stacksize0+stacksize1);/從公共緩沖區取數并進行加運算sem_post(&sem4);/增加信號量sem3void multi2(void)/線程運行函數,負責乘運算while(1)sem_wait(&sem4);/減少信號量sem4if(size=0)return;size-;printf("Multiply:%d*%d=%dn",stacksize0,stacksize1,stacksize0*stacksize1);/從公共緩沖區取數并進行乘運算sem_post(&sem1);/增加信號量

8、sem3int main(void)pthread_t t1,t2,t3,t4;/定義線程標識符sem_init(&sem1,0,1);/初始化信號量sem_init(&sem2,0,0);sem_init(&sem3,0,0);sem_init(&sem4,0,0);pthread_create(&t1,NULL,(void *)read1,NULL);/創立線程,綁定線程運行函數pthread_create(&t2,NULL,(void *)read2,NULL);pthread_create(&t3,NULL,(void *)plu

9、s1,NULL);pthread_create(&t4,NULL,(void *)multi2,NULL);pthread_join(t1,NULL);/等待線程運行結束2,數據結構信號量(semaphore):數據類型為結構 sem_t,本質上是一個長整型的數。公共緩沖區(stack):采用2維數組的方式實現(stackNUM2)。數組中的兩列分別存儲兩個文件中的數據。該2維數組還有一個索引:size,指向2維數組的頂部。五,實驗測試結果及分析實驗截圖:如下圖,加線程和乘線程從緩沖區讀取數據,進行運算,并將運算結果輸出。六,收獲及體會在本次實驗中,我學習了UNIX 類操作系統信號量機制,掌握了編寫Linux 環境下利用信號量實現進程控制的方法及相關系統調用的使用方法。在編譯的時候也遇到了一些問題,在讀取時data0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論