§1.1第一題實驗目標
題目場景:
某外語考試,主考在考場對10名應試者進行考核。考場內部每次只能接待1名考生。在考場外部的走廊裡,有5把椅子,有1名助理對坐在椅子上的考生進行叫號。
規則是:
1.考生需要首先坐在走廊裡的椅子上按照順序等待,如果沒有空椅子,只能等其他考生騰出椅子。
2.助理負責從坐在椅子上排隊等候的考生中順序引領一名考生進入考場;如果沒有人等待,助理等候;如果考場中已有考生應考,則須等當前考生結束考試後才能引領下一位考生。
3.當主考考核完一名考生後,考生方可離開;同時,考生等待助理引領下一位考生進入;如果沒有考生進入,主考等待。
實驗內容:
若採用linux作業系統,利用pthread api提供的訊號量機制,編寫應用程式實現該問題的解決方案。(windows亦有相應的解決方案)
可在乙個程序裡完成:從1個主線程開始,為每位考生生成1個執行緒(代表考生的動作),為主考、助理分別生成由1個執行緒(分別代表主考、助理的動作)。
通過在程式中合適的位置設定列印資訊,列印到螢幕上或文字檔案中,以顯示程式的正確執行過程。
題目中的考核操作:可用sleep函式模擬(讓程式sleep一段時間,3~5秒鐘為宜)。
要求:輸出內容清晰明了,輸出格式簡單統一,能夠很直觀地看出是那個執行緒輸出的什麼內容。
§1.2 第一題原理、方法、過程
1.2.1 題目分析
對於本題,首先我們可以看到存在3類實體,分別為主考,助理,考生。其行為分別如下。
(1)主考:等待助理將考生帶入場;對考生進行考試
(2)助理:等待考生進入椅子;帶領考生進考場;等候考生結束考試
(3)考生:等待空椅子;等待助理
不難發現,我們需要建立三類程序,分別為主考1,助理1,考生*10。
接下來需要對共享資源進行分析,可以發現存在兩個共享資源,大小為5的快取代表椅子的空位,以及大小為1的快取用來代表可用的助理人數。
1.2.2 設計思想
(1)考生間存在互斥,需要對五把椅子形成的快取區進行競爭。
(2)考生在排隊時與助理執行緒間存在同步,此時考生與助理間存在乙個可變共享快取區問題。
(3)助理叫號時,需要和主考執行緒同步,此時助理執行緒和主考執行緒之間構成乙個單一緩衝區共享問題。通過助理人數的快取進行。
(4)助理需要等待考生考完才能進行下一次叫號,存在乙個合作程序間執行次序的問題。
(5)為了保證程序間競爭,設計乙個驚群過程,使10個考生程序同時競爭。需要乙個驚群訊號量,在考生程序都建立後在釋放10個,釋放過程加鎖保護。
(6)為了使助理對考生按序叫號,快取使用佇列結構,佇列的進出需要加鎖保護
1.2.3訊號量設計
對於本題,存在以下訊號量
sc=5; //椅子空餘數
sa=1; //助教空餘數
m1=0; //椅子上人數
m2=0 ; //待考人數
panic=0; //驚群
mtx=0; //互斥鎖
1.2.4 流程圖設計
(1)考生流程圖
(2)助理流程圖
(3)主考
1.2.5 偽**設計
int main()
主考()
}助理()
}學生()
§1.3 第一題實驗結果(關鍵的真實**、截圖、結果等)
1.3.1 **展示(windows,c++)
#include #include#include#include#include#include#includeusing namespace std;
critical_section g_csvar; //建立關鍵段cs
handle sc; //椅子空餘數
handle sa; //助教空餘數
handle m1; //椅子上人數
handle m2 ; //待考人數
handle panic; //驚群訊號
mutex mtx; //互斥鎖
handle test; //考試是否結束
int num=-1; //結束考試的考生編號
queueid;
mapm;
void m() //主考程序
/*釋放驚群*/
long l;
mtx.lock();
releasesemaphore(panic, 10, &l);
mtx.unlock();
/*鏈結程序*/
for (int i = 0; i < 10; i++)
t1.join();
t2.join();
closehandle(sc); //銷毀訊號量
closehandle(sa);
closehandle(m1);
closehandle(m2);
closehandle(panic);
deletecriticalsection(&g_csvar);
}
1.3.2 學生入場順序
學生1 學生5 學生3 學生4 學生2 學生6 學生7 學生8 學生9 學生10
1.3.3實驗截圖
Linux 執行緒的同步與互斥(模擬買票系統)
臨界資源 多執行緒執行流共享的資源就叫做臨界資源 臨界區 每個執行緒內部,訪問臨界自娛的 就叫做臨界區 互斥 任何時刻,互斥保證有且只有乙個執行流進入臨界區,訪問臨界資源,通常對臨界資源起保護作用 原子性 不會被任何排程機制打斷的操作,該操作只有兩態,要麼完成,要麼未完成 多個執行緒併發的操作共享變...
互斥鎖 執行緒的同步與互斥
前面我們驗證了互斥鎖能夠保證執行緒的互斥操作,讓各執行緒對全域性變數的累加的次數保證了正確性執行緒 中 互斥鎖的介面函式 互斥鎖的初始化以及銷毀函式 初始化互斥鎖有兩種方式,一種是函式初始化,引數arr表示的是mutex的屬性,一般為null,設定為預設屬性 另一種是直接定義乙個全域性變數,並用巨集...
執行緒的同步與互斥
進行多執行緒程式設計,因為無法知道哪個執行緒會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決 執行緒之間對資源的競爭 1.互斥量mutex 2.訊號燈semaphore 3.條件變數 conditions mutex 互斥鎖線程控制 1 互斥鎖是用一種...