算法思想來自這本書,我在該基礎上換成了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
}