操作系統讀者寫者問題-----摘自《天勤操作系統高分筆記》

算法思想來自這本書,我在該基礎上換成了C++的版本,直接可以在VS下運行成功

讀者優先

#include<bits/stdc++.h>
#include <mutex>
using namespace std;
mutex rmutex;		//初始化信號量mutext,用於保持readcount的互斥訪問
mutex helpmutex;	//初始化信號量,用於保證對於數據區的寫互斥
int readercount = 0;	//用於記錄讀者數量,初始值爲0


static void Reader()
{
	while (true)					//循環執行這段代碼
	{
		rmutex.lock();			   //申請readCount的使用權,對應於書上的P(rmutex)
		if (readercount == 0)
		{
			helpmutex.lock();	 //如果爲第一個讀者,要阻止寫者進入,對應書上的P(helpmutext)
		}
		++readercount;			//讀者數量加1
		rmutex.unlock();		//釋放readercount的使用權,允許其他讀者使用,對應於書上的P(rmutext);
		
		//進行讀操作

		rmutex.lock();			//申請readercount的使用,要對其進行操作
		--readercount;			//讀者數量減1
		if (0 == readercount)
		{
			helpmutex.unlock();  //如果沒有了讀者,則允許寫者進入,對應於書上的V(helpmutext)
		}
		rmutex.unlock();		//釋放readercount的使用,允許其他讀者或者寫者使用
	}
}

static void writer()
{
	while (true)			//循環執行這段代碼
	{
		helpmutex.lock();	//申請對數據區進行訪問

		//進行寫操作

		helpmutex.unlock();	//釋放數據區,允許其他進程讀寫
	}
}

int main()
{
	system("pause");
	return 0;
}

公平情況-------按照達到的先後順序進行操作

#include<bits/stdc++.h>
#include <mutex>
using namespace std;

static mutex helpmutext;	//初始化mutext,用於控制互斥訪問數據區
static mutex rmutex;		//初始化rmutext,用於讀者互斥訪問readcount
static mutex wmutex;		//初始化wmutext,用於存在寫者時候禁止新讀者進入

static int readcount = 0;	//用於記錄讀者數量,初始值爲0

static void reader()		
{
	while (true)
	{
		wmutex.lock();		//檢測是否有寫者存在,無寫者時進入,對應書上的P(wmutex)
		rmutex.lock();		//申請使用readcount,對應書上的P(rmutex)
		if (readcount == 0)
		{
			helpmutext.lock(); //如果爲第一個讀者,要阻止寫者進入,對應書上的P(helpmutx)
		}
		++readcount;			// 讀者數量加1
		rmutex.unlock();	  //釋放readcount的使用權,允許其他讀者使用,對應書上的P(rmutex)

		wmutex.unlock();	  //恢復wmutex,對應於書上的V(wmutex)

		//進行讀操作

		rmutex.lock();
		--readcount;
		if (0 == readcount)
		{
			helpmutext.unlock();
		}
		rmutex.unlock();
	}
}

static void writer()
{
	wmutex.lock();			//檢測是否有其他讀者存在,無寫者時進入
	helpmutext.lock();		//申請讀數據區的訪問

	//進行寫操作
		
	helpmutext.unlock();	//釋放數據區,允許其他進程進行讀寫
	wmutex.unlock();		//恢復wmutext

}

寫者優先算法

#include<bits/stdc++.h>
#include <mutex>
using namespace std;

static mutex helpmutext;	//初始化mutext,用於控制互斥訪問數據區
static mutex rmutex;		//初始化rmutext,用於讀者互斥訪問readcount
static mutex wmutex;		//初始化wmutext,用於存在寫者時候禁止新讀者進入
static mutex readable;		//初始化readable,用於表示當前是否有寫者

static int readcount = 0, writecount = 0; // 分別用於記錄讀者和寫者的數量,初值均爲0

static void reader()
{
	readable.lock();		//檢查是否存在寫者,如果沒有則佔用進行後續操作
	rmutex.lock();			//佔用rmutex,準備修改readcount
	if ( 0 == readcount)
	{
		helpmutext.lock();	//如果是第一個讀者,則佔用數據區
	}
	++readcount;			//讀者數量加1
	rmutex.unlock();		//釋放rmutex,允許其他讀者訪問readcount
	readable.unlock();		//釋放readable,允許其他讀者或者寫者佔用

	//讀操作 

	rmutex.lock();			//佔用rmutex,準備修改readcount
	--readcount;
	if ( 0 == readcount)
	{
		helpmutext.unlock();
	}
	rmutex.unlock();
}

static void writer()
{
	wmutex.lock();			//佔用wmutext,準備修改writecount
	if ( 0 == writecount)	//若爲第一個寫者,則阻止後續讀者進入
	{
		readable.lock();
	}	
	++writecount;			//寫者數量加1
	wmutex.unlock();		//釋放wmutex,允許其他寫者修改writecount

	helpmutext.lock();		//等當前正在操作的讀者或者寫者完成之後,佔用數據區

	//寫操作

	helpmutext.unlock();	//寫完,釋放數據區

	wmutex.lock();			//佔用wmutext,準備修改writecount
	--writecount;			//寫者數量減1
	if (writecount == 0)
	{
		readable.unlock();	//如果是最後一個寫者,允許讀者進入
	}
	wmutex.unlock();		//釋放wmutex,允許其他寫者修改writecount
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章