$29
一、 作業目的
基於pthread的方式來熟悉 process coordination的觀念。
二、 作業內容
【生產空拍機】為了要與空拍機大廠T公司競爭,G公司希望能透過機器人自動化生產新型的空拍機。在空拍機工廠中,有3個生產站(producer)及1個原料配件分配者(dispatcher)在負責生產空拍機。每一個生產站會不斷製造空拍機,但是要做好一個空拍機需要具備下面三種模組配件:battery(電池)、aircraft(機體)、和 propeller(螺旋槳)等。為了加快製造速度,3個producer分別各擁有一種模組配件的材料,而dispatcher則不斷隨機供應3種原料配件到一個供應前台,供應時並且不會與供應前台上面已經有模組配件重複。
每當dispatcher準備好2種原料,缺這2種原料的producer便可以向dispatcher取得這2種原料,加上本身擁有的原料,製成一個空拍機。完成後通知供應模組配件的dispatcher,dispatcher接著再隨機地準備另外三種模組配件放到供應前台上去。
請設計程式模擬這producer和dispatcher同步處理的動作。在程式中做出適當的輸出,顯示出工廠生產空拍機的情況。假設工廠每天生產完50個空拍機以後需要停工休息,請在生產出第50個空拍機的時候,結束程式,列印出來dispatcher準備了多少各種模組配件,並按照生產空拍機的數量多寡順序,印出每個producer總共生產出多少個空拍機。
因此,你的程式可能會印出來
$prog3
Dispatcher: propeller
Dispatcher: battery
Producer (aircraft): OK, 1 drone(s)
Dispatcher: battery
…
Producer (battery): OK, 15 drone(s)
…
Producer (propeller): OK, 40 drone(s)
…
三、 作業要點
1. 請注意,本作業使用的程式語言是C/C++,測試平台的作業系統: Ubuntu 16.10 64-bit。使用的編譯
程式為g++ 編譯器:5.4。其他平台或程式語言不在本次作業考慮範圍之內。如在測試平台上無法編譯與執行,都不予給分。
2. 請注意,本作業必須要用 Pthread API中的 mutex機制來進行,例如pthread_mutex_init()。 不能使用semaphore機制,例如sem_init()。任何不用Pthread API mutex機制的程式,只能最多得到基本的30分。
3. 本作業的評分方式如下: a. 【基本功能】
i. 本作業必須以multithreaded的方式來完成,每個producer和dispatcher都各自是一個thread。沒有用此機制者,會扣50分。
ii. 本作業在處理準備模組配件以及取用模組配件的程式碼部分,都必須以pthread API中的mutex機制形成critical section來設計。不使用此機制者,會扣50分。
iii. 將分別考慮以下不同程度,按照正確性來給分。請在報告中說明自己完成的項目。
1. [基本] 亂數的產生必須在主程式一開始就用 srand(0); 的方式設定亂數種子,每次執行都會產生相同的亂數序列。(助教會修改 seed 值,進行測試),最多可得10分。
2. 正確使用pthread API 中的 mutex 機制形成critical section來處理 thread 之間的共用變數,最多可得20分。不使用此機制者,此部分 0分
3. 以下依照程式可執行的程度評分:
a. 基礎程度 :程式中只有一個 dispatcher 與一個 producer (有 battery模組)總共 2 個threads,dispatcher只會隨機分配其他2種模組配件。在此情況下,可以正確產生50個空拍機,印出生產過程以及 dispatcher 與 producer 正確資料。如果程式只完成到此程度,最多可得40分。
b. 完整程度:程式中有一個dispatcher 與3個 producer 總共4個threads,每個producer可以正確產生空拍機,且可以產生總共 50 個空拍機,印出生產過程以及 dispatcher 與 producer 正確資料,如果程式可完成到此程度,最多可得70分。
b. 【進階功能】完成以上基本功能者,才可按照以下項目,多得其他的分數。但請注意,如何demo
出你程式中的這些進階功能,必須在你的說明文件檔案中詳細說明,如果助教看不懂,可能反而會扣分。
i. 工廠增加一個dispatcher B。原先的dispatcher A負責 battery與aircraft 2種不同模組配件的供應, dispatcher B 負責aircraft與propeller。供應模組配件的方式如基本要求:如果已經供應,便不再重複,而且供應時是隨機供應。所有的dispatcher都以thread方式實做。其餘要求與基本功能相同。
可以正確印出生產過程以及dispatcher 與 producer 正確資料,本功能最多可得40分。
具備此功能者,請用 argv[] 的方式讀入參數,1表示基本功能中一個dispatcher的情況, 2表示本進階功能中兩個dispatchers的情況。並用argc 來判斷有無參數,如果沒有參數,預設為基本功能(即參數為 1)。例如以下執行方式:
$prog3 2
Dispatcher A: battery
Dispatcher B: propeller
Producer (aircraft): OK, 1 drone(s)
Dispatcher A: aircraft
…
4. 本作業需繳交檔案:
a. 說明報告:檔案為docx或pdf格式。
i. 報告中必須說明程式的設計理念、程式如何編譯,以及如何操作。
ii. 報告中同時必須詳細說明你完成哪些部份。如有用到特殊程式庫,請務必說明。
iii. 請務必讓助教明白如何編譯及測試你的程式。助教如果無法編譯或測試,會寄信(最多兩次)通知你來說明,但每說明一次,助教會少給你10分。
b. 完整原始程式碼。不可含執行檔。助教會重新編譯你們的程式。
5. 所有相關檔案,例如報告檔、程式檔、參考資料等,請壓縮成一個壓縮檔(不可超過2MB)後上傳至portal。請注意,不可抄襲。助教不會區分何者為原始版本,被判定抄襲者,一律0分。
四、 繳交方式:
1. 最終繳交時間:
a. 電子檔在 2017.06.02以前,上傳至個人portal。如有多個檔案,將所有檔案壓縮成zip(rar,7z 亦可)格式,然後上傳。
b. 上傳檔名格式:「學號 _ 作業號碼 .doc 」或「學號 _ 作業號碼 .rar 」 。 例如: 912233_01.doc 或912233_01.rar。
2. 如有違規事項者,依照課程規定處理。
3. 如需請假,請上portal請假,並持相關證明文件,在請假結束後的第一次上課時完成請假手續,並在一週內完成補交。補交作業將以8折計算。
4. 老師不接受「門縫」方式繳交,助教也不接受任何作業。
五、 如有未盡事宜,將在個人portal板面公告通知。
六、 If you need any assistance in English, please contact Prof. Yang.
七、 參考資訊:
1. 課本第6章
2. “How to Use C Mutex Lock Examples for Linux Thread Synchronization”, http://www.thegeekstuff.com/2012/05/c-mutex-examples/?refcom
3. “pthread ︰mutex”, http://angelonotes.blogspot.tw/2012/02/pthread-mutex.html
4.