专业课程设计之客户与服务器程序的同步与通信机制的设计(四)信号量
信號量版源碼下載地址為:
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; }
未運行程序如下所示:
產品增加到10后被掛起,如下圖所示:
總結
以上是生活随笔為你收集整理的专业课程设计之客户与服务器程序的同步与通信机制的设计(四)信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.3.1遍历二叉树
- 下一篇: python字典文件,python-文件