日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统课设之Windows 的互斥与同步

發(fā)布時間:2025/3/15 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统课设之Windows 的互斥与同步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

課程設計開始了,實驗很有意思,寫博客總結學到的知識
白嫖容易,創(chuàng)作不易,學到東西才是真
本文原創(chuàng),創(chuàng)作不易,轉(zhuǎn)載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/archives/177
PDF鏈接:見博客網(wǎng)站
CSDN: https://blog.csdn.net/RongLin02/article/details/118308666

為了美觀,實驗源代碼在結尾處,整合版見下
鏈接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w
提取碼:Lin2
操作系統(tǒng)課程設計源代碼
本次操作系統(tǒng)課程設計合集
操作系統(tǒng)課設之Windows 進程管理
操作系統(tǒng)課設之Linux 進程管理
操作系統(tǒng)課設之Linux 進程間通信
操作系統(tǒng)課設之Windows 的互斥與同步
操作系統(tǒng)課設之內(nèi)存管理
操作系統(tǒng)課設之虛擬內(nèi)存頁面置換算法的模擬與實現(xiàn)
操作系統(tǒng)課設之基于信號量機制的并發(fā)程序設計
操作系統(tǒng)課設之簡單 shell 命令行解釋器的設計與實現(xiàn)
僅用于學習,如有侵權,請聯(lián)系我刪除

實驗題目

Windows 的互斥與同步

實驗目的

(1) 回顧操作系統(tǒng)進程、線程的有關概念,加深對 Windows 線程的理解。
(2) 了解互斥體對象,利用互斥與同步操作編寫生產(chǎn)者-消費者問題的并發(fā)程序,加深對 P (即semWait)、V(即 semSignal)原語以及利用 P、V 原語進行進程間同步與互斥操作的理解。

實驗內(nèi)容實驗原理:

典型例題,生產(chǎn)者消費者問題,利用PV操作和Windows API實現(xiàn)生產(chǎn)者 消費者問題。
實驗步驟:
在Windows下用codeblocks新建一個project,然后將指導書的代碼復制到項目目錄下的main.cpp文件下。多次運行查看結果。
修改代碼,調(diào)整生產(chǎn)者線程和消費者線程的個數(shù),使得消費者數(shù)目大與生產(chǎn)者,看看結果有何不同。
修改代碼,按程序注釋中的說明修改信號量 EmptySemaphore 的初始化方法,看看結果有何不同。

實驗結果與分析

源代碼運行結果

符合預期,生產(chǎn)者生產(chǎn)一個,消費者消費,如此循環(huán)。

const unsigned short CONSUMERS_COUNT = 5; //消費者的個數(shù)

將消費者由1改成5個,結果如下

和不修改類似。

EmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);

將信號量如上修改,結果無輸出
符合預期,buff空的信號量最開始應該是等同于buff大小的,如果按照如上修改,buff空信號量初始化就是0,也就是buff一開始就是滿的,但是實際上buff是空的。所以生產(chǎn)者P(EmptySemaphore)時就是會一直等待,而因為生產(chǎn)者沒生產(chǎn),所以消費者P(FullSemaphore)時也是一直等待,所以就無輸出。

查閱相關問題和分析代碼,得出以下答案:
1)CreateMutex 中有幾個參數(shù),各代表什么含義。
三個參數(shù),分別是結構體指針;立即擁有互斥體(true);互斥體對象的名字,詳細解釋如下:
lpMutexAttributes SECURITY_ATTRIBUTES,指定一個SECURITY_ATTRIBUTES結構,或傳遞零值(將參數(shù)聲明為ByVal As Long,并傳遞零值),表示使用不允許繼承的默認描述符
bInitialOwner BOOL,如創(chuàng)建進程希望立即擁有互斥體,則設為TRUE。一個互斥體同時只能由一個線程擁有
lpName String,指定互斥體對象的名字。用vbNullString創(chuàng)建一個未命名的互斥體對象。如已經(jīng)存在擁有這個名字的一個事件,則打開現(xiàn)有的已命名互斥體。這個名字可能不與現(xiàn)有的事件、信號機、可等待計時器或文件映射相符。

2)CreateSemaphore 中有幾個參數(shù),各代表什么含義,信號量的初值在第幾個參數(shù)中。
一共有4個參數(shù),分別是結構體指針;信號量對象的初始計數(shù);信號量對象的最大計數(shù);信號量對象的名稱。
結構體指針和信號量對象名稱的參數(shù)的規(guī)則和Mutex的一樣。

3)程序中 P、V 原語所對應的實際 Windows API 函數(shù)是什么,寫出這幾條語句。

WaitForSingleObject(EmptySemaphore,INFINITE); //P操作 ReleaseSemaphore(FullSemaphore,1,NULL); //V操作 ReleaseMutex(Mutex); //V操作

4)CreateMutex 能用 CreateSemaphore 替代嗎?
嘗試修改程序 4-1,將信號量 Mutex 完全用CreateSemaphore 及相關函數(shù)實現(xiàn)。寫出要修改的語句。
可以,互斥信號量其實就是二元信號量
只需要修改初始化代碼和V操作代碼即可:

Mutex = CreateSemaphore(NULL,1,1,NULL); ReleaseSemaphore(Mutex,1,NULL); //V(mutex);

仔細閱讀源程序,找出創(chuàng)建線程的 WINDOWS API 函數(shù),回答下列問題:
線程的第一個執(zhí)行函數(shù)是什么(從哪里開始執(zhí)行)?
它位于創(chuàng)建線程的 API 函數(shù)的第幾個參數(shù)中?
創(chuàng)建線程的函數(shù):CreateThread(),執(zhí)行函數(shù)Producer()/Consumer(),位于第三個參數(shù)

小結與心得體會

Windows的API看著非常復雜,參數(shù)很多,而且定義了很多沒用過也沒見過的數(shù)據(jù)類型,由于時間緊迫并沒有深入研究那些復雜的語法,僅僅是會用信號量和PV操作。不過本次實驗也讓我了解到課本上那些算法和理論離我們并不遙遠,因為我已經(jīng)有過Java多線程程序開發(fā)的經(jīng)歷,Java多線程中同步問題在語法上比C/C++簡單一些,不過兩者用法都非常有各自語言的特點,獲益匪淺。
=w=

源代碼

4-1

#include <windows.h> #include <iostream> const unsigned short SIZE_OF_BUFFER = 2; //緩沖區(qū)長度 unsigned short ProductID = 0; //產(chǎn)品號 unsigned short ConsumeID = 0; //將被消耗的產(chǎn)品號 unsigned short in = 0; //產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標 unsigned short out = 0; //產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標 int buffer[SIZE_OF_BUFFER]; //緩沖區(qū)是個循環(huán)隊列 bool p_ccontinue = true; //控制程序結束 HANDLE Mutex; //用于線程間的互斥 HANDLE FullSemaphore; //當緩沖區(qū)滿時迫使生產(chǎn)者等待 HANDLE EmptySemaphore; //當緩沖區(qū)空時迫使消費者等待17 DWORD WINAPI Producer(LPVOID); //生產(chǎn)者線程 DWORD WINAPI Consumer(LPVOID); //消費者線程int main() { //創(chuàng)建各個互斥信號 //注意,互斥信號量和同步信號量的定義方法不同,互斥信號量調(diào)用的是 CreateMutex 函數(shù),同步信號量調(diào)用的是 CreateSemaphore 函數(shù),函數(shù)的返回值都是句柄。/*結構體指針;立即擁有互斥體(true);互斥體對象的名字*/Mutex = CreateMutex(NULL,FALSE,NULL);/*結構體指針;信號量對象的初始計數(shù);信號量對象的最大計數(shù);信號量對象的名稱*/EmptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL); //將上句做如下修改,看看結果會怎樣//EmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);FullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL); //調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當生產(chǎn)者個數(shù)多于消費者個數(shù)時, //生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待const unsigned short PRODUCERS_COUNT = 3; //生產(chǎn)者的個數(shù)const unsigned short CONSUMERS_COUNT = 1; //消費者的個數(shù) //總的線程數(shù)const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreads[THREADS_COUNT]; //各線程的 handleDWORD producerID[PRODUCERS_COUNT]; //生產(chǎn)者線程的標識符DWORD consumerID[CONSUMERS_COUNT]; //消費者線程的標識符 //創(chuàng)建生產(chǎn)者線程for (int i=0; i<PRODUCERS_COUNT; ++i){hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if (hThreads[i]==NULL)return -1;} //創(chuàng)建消費者線程for (int i=0; i<CONSUMERS_COUNT; ++i){hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);if (hThreads[i]==NULL)return -1;}while(p_ccontinue){if(getchar()) //按回車后終止程序運行{p_ccontinue = false;}}return 0; }//生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的 ID 號 void Produce() {std::cout << std::endl<< "Producing " << ++ProductID << " ... ";std::cout << "Succeed" << std::endl; } //把新生產(chǎn)的產(chǎn)品放入緩沖區(qū) void Append() {std::cerr << "Appending a product ... ";buffer[in] = ProductID;in = (in+1)%SIZE_OF_BUFFER;std::cerr << "Succeed" << std::endl; //輸出緩沖區(qū)當前的狀態(tài)for (int i=0; i<SIZE_OF_BUFFER; ++i){std::cout << i <<": " << buffer[i];if (i==in)std::cout << " <-- 生產(chǎn)";if (i==out)std::cout << " <-- 消費";std::cout << std::endl;} } //從緩沖區(qū)中取出一個產(chǎn)品 void Take() {std::cerr << "Taking a product ... ";ConsumeID = buffer[out];buffer[out] = 0;out = (out+1)%SIZE_OF_BUFFER;std::cerr << "Succeed" << std::endl; //輸出緩沖區(qū)當前的狀態(tài)for (int i=0; i<SIZE_OF_BUFFER; ++i){std::cout << i <<": " << buffer[i];if (i==in)std::cout << " <-- 生產(chǎn)";if (i==out)std::cout << " <-- 消費";std::cout << std::endl;} } //消耗一個產(chǎn)品 void Consume() {std::cout << "Consuming " << ConsumeID << " ... ";std::cout << "Succeed" << std::endl; } //生產(chǎn)者 DWORD WINAPI Producer(LPVOID lpPara) {while(p_ccontinue){WaitForSingleObject(EmptySemaphore,INFINITE); //p(empty);WaitForSingleObject(Mutex,INFINITE); //p(mutex);Produce();Append();Sleep(1500);ReleaseMutex(Mutex); //V(mutex);ReleaseSemaphore(FullSemaphore,1,NULL); //V(full);}return 0; } //消費者 DWORD WINAPI Consumer(LPVOID lpPara) {while(p_ccontinue){WaitForSingleObject(FullSemaphore,INFINITE);//P(full);WaitForSingleObject(Mutex,INFINITE); //P(mutex);Take();Consume();Sleep(1500);ReleaseMutex(Mutex); //V(mutex);ReleaseSemaphore(EmptySemaphore,1,NULL); //V(empty);}return 0; }

修改版

#include <windows.h> #include <iostream> const unsigned short SIZE_OF_BUFFER = 2; //緩沖區(qū)長度 unsigned short ProductID = 0; //產(chǎn)品號 unsigned short ConsumeID = 0; //將被消耗的產(chǎn)品號 unsigned short in = 0; //產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標 unsigned short out = 0; //產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標 int buffer[SIZE_OF_BUFFER]; //緩沖區(qū)是個循環(huán)隊列 bool p_ccontinue = true; //控制程序結束 HANDLE Mutex; //用于線程間的互斥 HANDLE FullSemaphore; //當緩沖區(qū)滿時迫使生產(chǎn)者等待 HANDLE EmptySemaphore; //當緩沖區(qū)空時迫使消費者等待17 DWORD WINAPI Producer(LPVOID); //生產(chǎn)者線程 DWORD WINAPI Consumer(LPVOID); //消費者線程int main() { //創(chuàng)建各個互斥信號 //注意,互斥信號量和同步信號量的定義方法不同,互斥信號量調(diào)用的是 CreateMutex 函數(shù),同步信號量調(diào)用的是 CreateSemaphore 函數(shù),函數(shù)的返回值都是句柄。/*結構體指針;立即擁有互斥體(true);互斥體對象的名字*/Mutex = CreateSemaphore(NULL,1,1,NULL);/*結構體指針;信號量對象的初始計數(shù);信號量對象的最大計數(shù);信號量對象的名稱*/EmptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL); //將上句做如下修改,看看結果會怎樣//EmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);FullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL); //調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當生產(chǎn)者個數(shù)多于消費者個數(shù)時, //生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待const unsigned short PRODUCERS_COUNT = 3; //生產(chǎn)者的個數(shù)const unsigned short CONSUMERS_COUNT = 1; //消費者的個數(shù) //總的線程數(shù)const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreads[THREADS_COUNT]; //各線程的 handleDWORD producerID[PRODUCERS_COUNT]; //生產(chǎn)者線程的標識符DWORD consumerID[CONSUMERS_COUNT]; //消費者線程的標識符 //創(chuàng)建生產(chǎn)者線程for (int i=0; i<PRODUCERS_COUNT; ++i){hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if (hThreads[i]==NULL)return -1;} //創(chuàng)建消費者線程for (int i=0; i<CONSUMERS_COUNT; ++i){hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);if (hThreads[i]==NULL)return -1;}while(p_ccontinue){if(getchar()) //按回車后終止程序運行{p_ccontinue = false;}}return 0; }//生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的 ID 號 void Produce() {std::cout << std::endl<< "Producing " << ++ProductID << " ... ";std::cout << "Succeed" << std::endl; } //把新生產(chǎn)的產(chǎn)品放入緩沖區(qū) void Append() {std::cerr << "Appending a product ... ";buffer[in] = ProductID;in = (in+1)%SIZE_OF_BUFFER;std::cerr << "Succeed" << std::endl; //輸出緩沖區(qū)當前的狀態(tài)for (int i=0; i<SIZE_OF_BUFFER; ++i){std::cout << i <<": " << buffer[i];if (i==in)std::cout << " <-- 生產(chǎn)";if (i==out)std::cout << " <-- 消費";std::cout << std::endl;} } //從緩沖區(qū)中取出一個產(chǎn)品 void Take() {std::cerr << "Taking a product ... ";ConsumeID = buffer[out];buffer[out] = 0;out = (out+1)%SIZE_OF_BUFFER;std::cerr << "Succeed" << std::endl; //輸出緩沖區(qū)當前的狀態(tài)for (int i=0; i<SIZE_OF_BUFFER; ++i){std::cout << i <<": " << buffer[i];if (i==in)std::cout << " <-- 生產(chǎn)";if (i==out)std::cout << " <-- 消費";std::cout << std::endl;} } //消耗一個產(chǎn)品 void Consume() {std::cout << "Consuming " << ConsumeID << " ... ";std::cout << "Succeed" << std::endl; } //生產(chǎn)者 DWORD WINAPI Producer(LPVOID lpPara) {while(p_ccontinue){WaitForSingleObject(EmptySemaphore,INFINITE); //p(empty);WaitForSingleObject(Mutex,INFINITE); //p(mutex);Produce();Append();Sleep(1500);ReleaseSemaphore(Mutex,1,NULL); //V(mutex);ReleaseSemaphore(FullSemaphore,1,NULL); //V(full);}return 0; } //消費者 DWORD WINAPI Consumer(LPVOID lpPara) {while(p_ccontinue){WaitForSingleObject(FullSemaphore,INFINITE);//P(full);WaitForSingleObject(Mutex,INFINITE); //P(mutex);Take();Consume();Sleep(1500);ReleaseSemaphore(Mutex,1,NULL); //V(mutex);ReleaseSemaphore(EmptySemaphore,1,NULL); //V(empty);}return 0; }

總結

以上是生活随笔為你收集整理的操作系统课设之Windows 的互斥与同步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品国产成人 | 99视频免费看 | 有码中文字幕 | 中文字幕成人在线视频 | 日韩精品在线观看免费 | 日本xxxxxxxxx18 | 日本黄色视 | 麻豆com| 天堂av手机版 | 国产强伦人妻毛片 | 91精品美女 | 冲田杏梨一区二区三区 | 性高湖久久久久久久久免费 | 中文字幕亚洲视频 | 国产精品久久毛片 | 在线久草 | 久久久久亚洲精品系列色欲 | 久久久久久久久久久久久久久久久久久久 | 亚洲欧美日韩高清 | 免费一级特黄 | 高清国产一区二区三区 | 久久97精品久久久久久久不卡 | 欧美色88| 中文字幕人妻熟女人妻a片 麻豆91视频 | 久久这里有精品 | 久久性视频 | 午夜视频精品 | 天天干天天噜 | 亚洲精品国产精品乱码不99按摩 | 麻豆黄色一级片 | 亚洲欧美视频二区 | 一级黄色片免费观看 | 精品少妇一区二区三区密爱 | free黑人多人性派对hd | 亚洲精品无码一区二区 | 日本少妇一区 | 成年丰满熟妇午夜免费视频 | 99视屏 | 99久久久无码国产精品性 | 欧美色妞网 | 三级全黄视频 | 日韩a级一片 | 日韩高清三区 | 黄色在线免费网站 | 亚洲第一综合色 | 在线免费观看亚洲 | 黄色免费一级 | 国产视频污在线观看 | 国产免费av观看 | 色哟哟视频网站 | 黄色a毛片 | 大片视频免费观看视频 | 午夜精品视频在线 | 亚洲伦理在线播放 | 日韩中文字幕综合 | 国产亚洲精品码 | 丰满尤物白嫩啪啪少妇 | 国产日韩欧美中文 | 亚洲毛片一区二区 | www.youjizz日本| 俺来也av| 日日干夜夜爽 | 青青草手机在线视频 | 国产全是老熟女太爽了 | 久久人妖 | 靠逼动漫 | 色爱视频 | 免费成人美女女电影 | 欧美怡红院一区二区三区 | 亚洲在线一区二区三区 | 国产草草草 | 99热激情| 国产在线18 | 丁香婷婷在线 | 91精品国产自产91精品 | 亚洲色图欧美在线 | 四虎tv | 香蕉视频99| 四虎影院成人 | ,一级淫片a看免费 | 国产精品一线天粉嫩av | 在线黄av | 97国产在线播放 | 亚洲国产精彩视频 | 欧美精品免费看 | 国产精品搬运 | 欧美日韩激情在线观看 | 91成人免费在线观看视频 | 国产免费久久精品国产传媒 | 色播在线视频 | 99自拍偷拍 | 国产精品一区二区三区免费视频 | 午夜久久久久久久久久影院 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 午夜一区二区三区在线 | 日韩一区二区三区电影 | 精品影片一区二区入口 | 成年人性生活视频 | 草草在线免费视频 |