資源描述:
《實驗五線程間的互斥與同步》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、實驗五線程間的互斥與同步姓名:王睿慕學號:14072233完成口期:2016年12月11口一、實驗目的理解POSIX線程(Pthread)互斥鎖和POSIX信號量機制,學習它們的使用方法;編寫程序,實現(xiàn)多個POSIX線程的同步控制。二、實驗內(nèi)容【任務5.1】創(chuàng)建4個POSIX線程。其中2個線程(A和B}分別從2個數(shù)據(jù)文件(datal.txt和data2.txt)讀取10個整數(shù).線程A和B把從文件中讀取的整數(shù)逐一放入一個緩沖池。緩沖池由n個緩沖區(qū)構(gòu)成(n=5,并可以方便地調(diào)整為其他值),每個緩沖區(qū)可以存放一個整數(shù)。另外2個線程,C和D,每次從緩沖池讀取1個數(shù)據(jù),分別共計讀10次。線程C、D
2、,每讀出2個數(shù)據(jù),分別求出兩個數(shù)的和或乘積,并打卬輸出。提示:(1)在創(chuàng)建4個線程當中,A和B是生產(chǎn)者,負責從文件讀取數(shù)據(jù)到公共的緩沖區(qū),C和D是消費者,從緩沖區(qū)讀収數(shù)據(jù)然后作不同的計算(加和乘運算)。使用互斥鎖和信號量控制這些線程的同步。不限制線程C和D從緩沖區(qū)得到的數(shù)據(jù)來自哪個文件。(2)在生產(chǎn)者線程中,確保從文件讀出數(shù)據(jù)以后,再去“生產(chǎn)”。三、實驗要求按照要求編寫程序,放在相應的目錄屮,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設計(1)功能設計從dataO.txt和datal.txt輪流讀入總計十個數(shù),每讀取兩個數(shù)都可以通過鍵盤控制(輸入1或者2)對這兩個數(shù)
3、選擇進行加法操作或者乘法操作。(2)數(shù)據(jù)結(jié)構(gòu)使用二維數(shù)組作為公共緩沖區(qū)(經(jīng)老師mtbuffer[2]:指正它的實質(zhì)其實是棧)voidinitial():voidreadl():voidread20:voidcalculate0:除了主函數(shù)main以外設定了四個函數(shù),readl函數(shù)和read2函數(shù)分別用于從dataO.txt和datal.txt讀入10個數(shù),calculate函數(shù)根據(jù)用戶的反饋來確定進行加法操作還是乘法操作oInitial函數(shù)用于對信號量進行初始化。主函數(shù)里依次調(diào)用這些函數(shù)intaain(void)mtbuffer[NUM][2]:pthread.ttl,t2,t3:〃定義
4、線程標識符initial0:pthread_create(&t1,NULL,(void?)readl,NULL)://創(chuàng)建線程甘淀線程運行因曠pthread^create(&t2,NULL,(void*)read2,NULL):pthread_create(&t3,NULL^(void*)calculate,NULL):pthread_join(t1,NULL):/,等詩線程運亍結(jié)束⑶程序框圖t2t3*&&:&」⑷參數(shù)說明整型數(shù)組intbuffer[NUM][2];用來存放線程從文件所讀入的10個數(shù);數(shù)組索引intsize=O;指向數(shù)組的頂部之后在存収數(shù)據(jù)的時候值會發(fā)生變化;三個信號量s
5、em_tseml,sem2,sem3;整型變量intget_num;由鍵盤讀入,用來控制線程進行加運算或者乘運算。⑸源代碼#include#include#inelude#defineNUM200intbuffer[NUM][2];〃公共緩沖區(qū)intsize=0;〃初始化數(shù)組索引semjsemlzsem2rsem3;〃定義3個信號量voidinitial();voidread1();voidread20;voidcalculateQ;intmain(void)//intbuffer[NUM][2];pthread.ttl,
6、t2,t3;〃定義線程標識符initialO;pthread_create(&tl,NULL,(void*)readl,NULL);//創(chuàng)建線程并調(diào)用自定義函數(shù)pthread_create(&t2.NULL,(void*)read2,NULL);pthread_create(&t3fNULU(void*)calculate,NULL);pthreadjoin(tl,NULL);}voidinitial(){sem_init(&seml,0,l);〃初始化信號量semjnit(&sem2Q0);sem」nit(&sem3,0r0);}voidreadl(){〃負責從文件讀取數(shù)據(jù)FILE*f
7、p二fopen("data0.txt","r");〃以只讀方式打開文件dataOwhile(!feof(fp)){sem_wait(&seml);〃減少信號呈semiif(!fscanf(fp/%d%dM/&buffer[size][O]/&buffer(size](l]))return;size++;〃讀兩個數(shù)到公共緩沖區(qū)sem_post(&sem2);〃増加信號量sem2}fclose(fp);〃關(guān)閉文件}voidread2()