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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

专业课程设计之客户与服务器程序的同步与通信机制的设计(四)信号量

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 专业课程设计之客户与服务器程序的同步与通信机制的设计(四)信号量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

信號量版源碼下載地址為:


http://download.csdn.net/detail/qq78442761/9862942

---------------------------------------------------------------------------------------------------------------------------------------------------------

互斥鎖版源碼下載地址為:

http://download.csdn.net/detail/qq78442761/9856423


---------------------------------------------------------------------------------------------------------------------------------------------------------

上一節為數據共享和線程,未讀的博友請先閱讀:

http://blog.csdn.net/qq78442761/article/details/72819470


---------------------------------------------------------------------------------------------------------------------------------------------------------



上一個版本里面,使用的是互斥鎖。

在本博文里面,將會使用信號量進行資源同步。

下面是Qt中對信號量的解釋。

如下圖所示:


所有易知,信號量是互斥鎖的擴展,并且是一個計數的功能。

使用acquire函數對資源進行要求(減少)。

使用release函數對資源進行發布(增加)。

下面是官方給出的例子,如下圖所示:


在本程序中,我們用兩個信號量,一個信號量用于生產與消費,一個信號量用于判斷產品是否為滿。

代碼如下所示。

resource.h

#ifndef RESOURCE_H #define RESOURCE_Hclass Resource //資源類 { public: Resource(); //編程時一般把要共享的東西設置為靜態(也就是保存到靜態區)(也就是臨界資源)static int getResourceNum(); //獲得資源的數量static void increaseResourceNum(int); //增加資源的數量static void reduceResourceNum(int); //減少資源的數量static void changeToSomeNumber(int); //把資源的數量直接改變成某值static int resourceNum; //資源的數量 };#endif // RESOURCE_H resource.cpp
/* 生產者和消費者實驗使用信號量實現線程的同步 */#include "resource.h" //包含"resource.h" #include <QSemaphore> //使用了信號量,也就是包含在QSemaphore這個頭文件//生產者線程和消費者線程啟動后,生產者把自由空間轉變成用過 //的空間,消費者再把用過的空間中的數據消費掉轉變成自由空間,QSemaphore freeSpace(10); //生產者初始擁有10個數據緩存區 QSemaphore usedSpace(0);//消費者初始使用了0個數據int Resource::resourceNum=0; //靜態成員的初始化Resource::Resource() //構造函數 {}int Resource::getResourceNum() //得到產品的資源數量 {return resourceNum; //返回資源的數量 }void Resource::increaseResourceNum(int Num) //增加產品的數量 {//若生存者充滿了消費者未讀的數據,acquire()就會被阻塞,直到消費者開始消費這些數據freeSpace.acquire(Num);//獲取“自由的”字節resourceNum+=Num; //產品的數量加上Num個產品數量usedSpace.release(Num);//轉換為“用過的”字節return; }void Resource::reduceResourceNum(int Num) {//若buffer沒有任何可讀數據,acquire()就會被阻塞,直到生產者生產一些數據usedSpace.acquire(Num);//獲取“用過的”資源,如果沒有則一直阻塞,直到有資源為止resourceNum-=Num;//產品的數量減去上Num個產品數量freeSpace.release(Num);//轉換為“自由的”字節return; }void Resource::changeToSomeNumber(int Num) //改變產品的數量為某一個值 {resourceNum=Num; //把變量Num的數量賦值給資源的數量return; }


下面給出運行結果。因為freeSpace是10,所以當產品增加到10時會被掛起。

未運行程序如下所示:

產品增加到10后被掛起,如下圖所示:



總結

以上是生活随笔為你收集整理的专业课程设计之客户与服务器程序的同步与通信机制的设计(四)信号量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。