實驗二 進程的互斥與同步(生產者與消費者問題)實驗報告 實驗目的 bb_第1頁
已閱讀1頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗二 實驗二 實驗二 實驗二 進程的互斥與同步(生產者與消費者問題)實驗報告 進程的互斥與同步(生產者與消費者問題)實驗報告 進程的互斥與同步(生產者與消費者問題)實驗報告 進程的互斥與同步(生產者與消費者問題)實驗報告實驗目的: 實驗目的: 實驗目的: 實驗目的:利用 利用 利用 Windows Windows Windows 提供的 提供的 提供的 API API API 函數,用 函數,用 函數,用 VISUALC++ VISU

2、ALC++ VISUALC++ 6.0 6.0 6.0 編寫程序,解決生產者與 編寫程序,解決生產者與 編寫程序,解決生產者與消費者問題,實現(xiàn)進程的互斥與同步 消費者問題,實現(xiàn)進程的互斥與同步 消費者問題,實現(xiàn)進程的互斥與同步 實驗內容和步驟: 實驗內容和步驟: 實驗內容和步驟: 實驗內容和步驟:本實驗設計在同一個進程地址空間內執(zhí)行的七個線程。三個生產者線程 本實驗設計在同一個進程地址空間內執(zhí)行的七個線程。三個生產者線程 本實驗設計在同

3、一個進程地址空間內執(zhí)行的七個線程。三個生產者線程四個消費者線程。生產者線程生產物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程 四個消費者線程。生產者線程生產物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程 四個消費者線程。生產者線程生產物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。生產者線程生產物品時,若無 消費。消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。生產者線程生產物品時,

4、若無 消費。消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。生產者線程生產物品時,若無空緩沖區(qū)可用,生產者線程必須等待消費者線程釋放出一個空緩沖區(qū);消費者線程消費物 空緩沖區(qū)可用,生產者線程必須等待消費者線程釋放出一個空緩沖區(qū);消費者線程消費物 空緩沖區(qū)可用,生產者線程必須等待消費者線程釋放出一個空緩沖區(qū);消費者線程消費物品時,若無滿的緩沖區(qū),消費者線程將被阻塞,直到新的物品被生產出來。 品時,若無滿的緩沖區(qū),消費者線程將被阻塞,直到新的

5、物品被生產出來。 品時,若無滿的緩沖區(qū),消費者線程將被阻塞,直到新的物品被生產出來。本實驗中三個生產者線程的區(qū)別只在生產產品的時間不同,分別為: 本實驗中三個生產者線程的區(qū)別只在生產產品的時間不同,分別為: 本實驗中三個生產者線程的區(qū)別只在生產產品的時間不同,分別為:1 1 秒、 秒、 秒、2 2 秒、 秒、 秒、3 3 秒;四個消費者線程的區(qū)別也只在消費產品的時間不同,分別為: 秒;四個消費者線程的區(qū)別也只在消費產品的時間不同,分別為

6、: 秒;四個消費者線程的區(qū)別也只在消費產品的時間不同,分別為:0.5 0.5 0.5 秒、 秒、 秒、1 1 秒、 秒、 秒、1.5 1.5 1.5 秒、 秒、 秒、2 2 秒。它們使用二個不同的緩沖區(qū)。需要使用如下信號量: 秒。它們使用二個不同的緩沖區(qū)。需要使用如下信號量: 秒。它們使用二個不同的緩沖區(qū)。需要使用如下信號量: 一個互斥信號量,用以阻止生產者線程和消費者線程同時操作緩沖區(qū)列表; 一個互斥信號量,用以阻止生產者線程和消費者

7、線程同時操作緩沖區(qū)列表; 一個互斥信號量,用以阻止生產者線程和消費者線程同時操作緩沖區(qū)列表;一個信號量,用于當緩沖區(qū)滿時讓生產者線程等待; 一個信號量,用于當緩沖區(qū)滿時讓生產者線程等待; 一個信號量,用于當緩沖區(qū)滿時讓生產者線程等待; 一個信號量,用于當緩沖區(qū)空時讓消費者線程等待; 一個信號量,用于當緩沖區(qū)空時讓消費者線程等待; 一個信號量,用于當緩沖區(qū)空時讓消費者線程等待; 接下來利用 接下來利用 接下來利用 VC++6.0 VC++

8、6.0 VC++6.0 編寫一段程序,模擬生產者和消費者線程,實現(xiàn)進程的互斥 編寫一段程序,模擬生產者和消費者線程,實現(xiàn)進程的互斥 編寫一段程序,模擬生產者和消費者線程,實現(xiàn)進程的互斥與同步。 與同步。 與同步。程序結果通過 程序結果通過 程序結果通過 DOS DOS DOS 下窗口輸出,使生產者和消費者自動生產和消費產品,通過 下窗口輸出,使生產者和消費者自動生產和消費產品,通過 下窗口輸出,使生產者和消費者自動生產和消費產品,通過按

9、回車鍵來使程序退出。 按回車鍵來使程序退出。 按回車鍵來使程序退出。 主程序結構: 主程序結構: 主程序結構: 主程序結構: 1 1、 、 此程序要用到的頭文件,有 此程序要用到的頭文件,有 此程序要用到的頭文件,有 3 3 個: 個: 個:windows.h windows.h windows.h、 、iostream iostream iostream、 、d_random.h d_random.h d_random.h(用于產生隨

10、機數 (用于產生隨機數 (用于產生隨機數模擬產品) 模擬產品) 模擬產品) 2 2、 、 全局變量的定義,分別有: 全局變量的定義,分別有: 全局變量的定義,分別有:h_Mutex h_Mutex h_Mutex(互斥信號) (互斥信號) (互斥信號) 、 、bufferFullSemaphore bufferFullSemaphore bufferFullSemaphore(當緩沖區(qū)滿時 (當緩沖區(qū)滿時 (當緩沖區(qū)滿時生產者等待信號量

11、) 生產者等待信號量) 生產者等待信號量) 、 、bufferEmptySemaphore bufferEmptySemaphore bufferEmptySemaphore(當緩沖區(qū)空時消費者等待信號量) (當緩沖區(qū)空時消費者等待信號量) (當緩沖區(qū)空時消費者等待信號量) 、 、BUFFER_SIZE BUFFER_SIZE BUFFER_SIZE(緩沖區(qū)長度) (緩沖區(qū)長度) (緩沖區(qū)長度) 、 、buffer[] buffer[]

12、 buffer[](數組模擬緩沖區(qū)循環(huán)隊列) (數組模擬緩沖區(qū)循環(huán)隊列) (數組模擬緩沖區(qū)循環(huán)隊列) 、 、in in in(用與追蹤產 (用與追蹤產 (用與追蹤產品進緩沖區(qū)時的緩沖區(qū)數組下標) 品進緩沖區(qū)時的緩沖區(qū)數組下標) 品進緩沖區(qū)時的緩沖區(qū)數組下標) 、 、out out out(用與追蹤產品出緩沖區(qū)時的緩沖區(qū)數組下 (用與追蹤產品出緩沖區(qū)時的緩沖區(qū)數組下 (用與追蹤產品出緩沖區(qū)時的緩沖區(qū)數組下標) 標) 標) 、 、rndNu

13、m rndNum rndNum(用于產生隨機數) (用于產生隨機數) (用于產生隨機數) 、 、producerID[] producerID[] producerID[](生產者線程的標識符) (生產者線程的標識符) (生產者線程的標識符) 、 、consumerID[] consumerID[] consumerID[](消費者線程的標識符) (消費者線程的標識符) (消費者線程的標識符) 、 、control control co

14、ntrol(控制生產者消費者線程的循環(huán)的標志) (控制生產者消費者線程的循環(huán)的標志) (控制生產者消費者線程的循環(huán)的標志)3 3、 、 生產者函數, 生產者函數, 生產者函數,3 3 個生產者的函數名字分別為: 個生產者的函數名字分別為: 個生產者的函數名字分別為:producer1 producer1 producer1、 、producer2 producer2 producer2、 、producer3 producer3 pro

15、ducer3,其中 ,其中 ,其中區(qū)別只在于函數中的 區(qū)別只在于函數中的 區(qū)別只在于函數中的 Sleep() Sleep() Sleep()的參數不同,分別為: 的參數不同,分別為: 的參數不同,分別為:1000 1000 1000、 、2000 2000 2000、 、3000 3000 3000。此函數用于執(zhí) 。此函數用于執(zhí) 。此函數用于執(zhí)行生產者線程時所要進行的操作,本程序模擬生產者生產一個 行生產者線程時所要進行的操作,本程序模

16、擬生產者生產一個 行生產者線程時所要進行的操作,本程序模擬生產者生產一個 10000 10000 10000 到 到 99999 99999 99999 的隨機 的隨機 的隨機數做產品,并輸出生產出的這個數字,并輸出產品生產后緩沖區(qū)的儲存情況 數做產品,并輸出生產出的這個數字,并輸出產品生產后緩沖區(qū)的儲存情況 數做產品,并輸出生產出的這個數字,并輸出產品生產后緩沖區(qū)的儲存情況4 4、 、 消費者函數, 消費者函數, 消費者函數,4 4

17、個消費者的函數名字分別為: 個消費者的函數名字分別為: 個消費者的函數名字分別為:consumer1 consumer1 consumer1、 、consumer2 consumer2 consumer2、 、consumer3 consumer3 consumer3、 、consumer4 consumer4 consumer4,其中區(qū)別只在于函數中的 ,其中區(qū)別只在于函數中的 ,其中區(qū)別只在于函數中的 Sleep() Sleep()

18、 Sleep()的參數不同,分別為: 的參數不同,分別為: 的參數不同,分別為:500 500 500、 、1000 1000 1000、 、1500 1500 1500、 、2000 2000 2000。此函數用于執(zhí)行消費者線程時所要進行的操作,本程序模擬消費者消費 。此函數用于執(zhí)行消費者線程時所要進行的操作,本程序模擬消費者消費 。此函數用于執(zhí)行消費者線程時所要進行的操作,本程序模擬消費者消費一個緩沖區(qū)已經存在的數字,消費完后使此緩

19、沖區(qū)的數字變 一個緩沖區(qū)已經存在的數字,消費完后使此緩沖區(qū)的數字變 一個緩沖區(qū)已經存在的數字,消費完后使此緩沖區(qū)的數字變 0 0 來表示該區(qū)無產品,并 來表示該區(qū)無產品,并 來表示該區(qū)無產品,并輸出產品生產后緩沖區(qū)的儲存情況 輸出產品生產后緩沖區(qū)的儲存情況 輸出產品生產后緩沖區(qū)的儲存情況5 5、 、 主函數部分,對全局變量定義的信號量賦值,創(chuàng)建 主函數部分,對全局變量定義的信號量賦值,創(chuàng)建 主函數部分,對全局變量定義的信號量賦值,創(chuàng)建

20、3 3 個生產者線程和 個生產者線程和 個生產者線程和 4 4 個消費者線 個消費者線 個消費者線程,實驗當按回車鍵的時候程序退出(使控制變量 程,實驗當按回車鍵的時候程序退出(使控制變量 程,實驗當按回車鍵的時候程序退出(使控制變量 control control control 為 為 false false false) )實驗中所遇到的問題及解決辦法: 實驗中所遇到的問題及解決辦法: 實驗中所遇到的問題及解決辦法: 實驗中所遇到

21、的問題及解決辦法: 1 1、 、 生產者消費者函數問題。 生產者消費者函數問題。 生產者消費者函數問題。 由于 由于 由于 3 3 個生產者函數之間和 個生產者函數之間和 個生產者函數之間和 4 4 個消費者函數之間的區(qū)別只是 個消費者函數之間的區(qū)別只是 個消費者函數之間的區(qū)別只是 Sleep Sleep Sleep()這個函數的參 ()這個函數的參 ()這個函數的參數不同,于是一開始我編了一個生產者函數和一個消費者函數,它們都接受一個

22、參數 數不同,于是一開始我編了一個生產者函數和一個消費者函數,它們都接受一個參數 數不同,于是一開始我編了一個生產者函數和一個消費者函數,它們都接受一個參數sleepTime sleepTime sleepTime 用于確定 用于確定 用于確定 Sleep Sleep Sleep()函數中的參數。但在創(chuàng)建線程的函數 ()函數中的參數。但在創(chuàng)建線程的函數 ()函數中的參數。但在創(chuàng)建線程的函數 CreateThread CreateThre

23、ad CreateThread()中, ()中, ()中,生產者函數和消費者函數要做為這個函數的第三個參數傳進來,而這個創(chuàng)建線程的函數的 生產者函數和消費者函數要做為這個函數的第三個參數傳進來,而這個創(chuàng)建線程的函數的 生產者函數和消費者函數要做為這個函數的第三個參數傳進來,而這個創(chuàng)建線程的函數的參數定義來看,第三個傳遞進來的函數不能接受非 參數定義來看,第三個傳遞進來的函數不能接受非 參數定義來看,第三個傳遞進來的函數不能接受非 voi

24、d void void * *類型的參數,于是該方案失敗, 類型的參數,于是該方案失敗, 類型的參數,于是該方案失敗,考慮過把生產者和消費者創(chuàng)建成類,但還是失敗了,最終解決辦法是編寫了 考慮過把生產者和消費者創(chuàng)建成類,但還是失敗了,最終解決辦法是編寫了 考慮過把生產者和消費者創(chuàng)建成類,但還是失敗了,最終解決辦法是編寫了 3 3 個生產者函 個生產者函 個生產者函數和 數和 數和 4 4 個消費者函數,導致代碼加長。更有效的解決辦法還請老

25、師指導指導。 個消費者函數,導致代碼加長。更有效的解決辦法還請老師指導指導。 個消費者函數,導致代碼加長。更有效的解決辦法還請老師指導指導。2 2、 、 程序結束問題。 程序結束問題。 程序結束問題。 一開始我想讓程序自動結束,初步想法是定義一個變量追蹤實際線程數目,再定義一 一開始我想讓程序自動結束,初步想法是定義一個變量追蹤實際線程數目,再定義一 一開始我想讓程序自動結束,初步想法是定義一個變量追蹤實際線程數目,再定義一 個常量為最

26、大線程數目,當實際線程數目大于最大線程數目時程序結束(見我原程序注釋 個常量為最大線程數目,當實際線程數目大于最大線程數目時程序結束(見我原程序注釋 個常量為最大線程數目,當實際線程數目大于最大線程數目時程序結束(見我原程序注釋掉了的變量及程序) 掉了的變量及程序) 掉了的變量及程序) ,此辦法我運行后程序并不能如我想的結束,百思不得其解后我變把程 ,此辦法我運行后程序并不能如我想的結束,百思不得其解后我變把程 ,此辦法我運行后程序并不

溫馨提示

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

評論

0/150

提交評論