讀者寫者問題

2021-06-29 05:37:06 字數 4242 閱讀 3477

問題簡述

讀者-寫者問題的讀寫操作限制(包括讀者優先和寫者優先):

1)寫-寫互斥,即不能有兩個寫者同時進行寫操作。

2)讀-寫互斥,即不能同時有乙個執行緒在讀,而另乙個執行緒在寫。

3)讀-讀允許,即可以有乙個或多個讀者在讀。

讀者優先的附加限制:如果乙個讀者申請進行讀操作時已有另乙個讀者正在進行讀操作,則該讀者可直接開始讀操作。

寫者優先的附加限制:如果乙個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源,則該讀者必須等到沒有寫者處於等待狀態後才能開始讀操作。

測試內容

handle createthread(

lpsecurity_attributes lpthreadattributes,

dword dwstacksize,

lpthread_start_routine lpstartaddress,

lpvoid lpparameter,

dword dwcreationflag,

lpdword lpthreadid);

2.s1eep

函式功能:

該函式對於指定的時間間隔掛起當前的執行執行緒。

函式原型:void sleep(dword dwmilliseconds);

3.createmutex

函式功能:

該函式建立有名或者無名的互斥物件。

函式原型:

handle createmutex(lpsecurity_attributes lpmutexattributes,

bool binitialowner,

lpctstr lpname);

4.releasemutex

函式功能:

該函式放棄指定互斥物件的所有權。

函式原型:bool releasemutex (handle hmutex)

5.waitforsingleobject

函式功能:

當下列情況之一發生時該函式返回:(1)指定物件處於訊號態;(2)超時。

函式原型:

dword waitforsingleobject(handle hhandle,dword dwmilliseconds);

程式簡介

1.讀者優先.cpp

讀者優先指的是除非有寫者在寫檔案,否則讀者不需要等待。所以可以用乙個整型變數read_count記錄當前的讀者數目,用於確定是否需要釋放正在等待的寫者執行緒(當read_count=0時,表明所有的讀者讀完,需要釋放寫者等待佇列中的乙個寫者)。每乙個讀者開始讀檔案時,必須修改read_count變數。因此需要乙個互斥物件mutex來實現對全域性變數read_count修改時的互斥。

另外,為了實現寫-寫互斥,需要增加乙個臨界區物件write。當寫者發出寫請求時,必須申請臨界區物件的所有權。通過這種方法,也可以實現讀-寫互斥,當read_count=1時(即第乙個讀者到來時),讀者執行緒也必須申請臨界區物件的所有權。

當讀者擁有臨界區的所有權時,寫者阻塞在臨界區物件write上。當寫者擁有臨界區的所有權時,第乙個讀者判斷完「read_count==1」後阻塞在write上,其餘的讀者由於等待對read_count的判斷,阻塞在mutex上。

2.寫者優先.cpp

寫者優先與讀者優先類似。不同之處在於一旦乙個寫者到來,它應該盡快對檔案進行寫操作,如果有乙個寫者在等待,則新到來的讀者不允許進行讀操作。為此應當新增乙個整型變數write_count,用於記錄正在等待的寫者的數目,當write_count=0時,才可以釋放等待的讀者執行緒佇列。

為了對全域性變數write_count實現互斥,必須增加乙個互斥物件mutex3。

為了實現寫者優先,應當新增乙個臨界區物件read,當有寫者在寫檔案或等待時,讀者必須阻塞在read上。

讀者執行緒除了要對全域性變數read_count實現操作上的互斥外,還必須有乙個互斥物件對阻塞read這一過程實現互斥。這兩個互斥物件分別命名為mutexl和mutex2。

**

讀者優先

#include

#include

#include

#include

#include

#include

using

namespace

std;

//讀者優先

struct threadthread[100];

handle rmutex; //hx

handle wmutex; //hwsem

int readcount;

int totaldura;

int curtime;

void write_op(int iprocess)*/

cout

<< "寫程序"

<< iprocess << "結束寫操作"

<< endl;

}void read_op(int iprocess)*/

cout

<< "讀程序"

<< iprocess << "結束讀操作"

<< endl;

}dword winapi reader(lpvoid lpvoid)

dword winapi writer(lpvoid lpvoid)

int main()

}curtime++;

sleep(1000);

cout

<< "當前時間="

<< curtime << endl;

if (curtime == 23) break;

}file.close();

//sleep((dword)(totaldura * 1000));

//cout << thread[1].num << endl;

//system("pause");

getchar();

}

寫者優先

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct threadthread[100];

handle rmutex; //hx

handle wmutex; //hwsem

handle wblock;

handle rblock;

handle mutex;

int readcount;

int writecount;

int totaldura;

int curtime;

void write_op(int iprocess)*/

cout

<< "寫程序"

<< iprocess << "結束寫操作"

<< endl;

}void read_op(int iprocess)*/

cout

<< "讀程序"

<< iprocess << "結束讀操作"

<< endl;

}dword winapi reader(lpvoid lpvoid)

dword winapi writer(lpvoid lpvoid)

int main()

}curtime++;

sleep(1000);

cout

<< "當前時間="

<< curtime << endl;

if (curtime == 25) break;

}file.close();

//sleep((dword)(totaldura * 1000));

//cout << thread[1].num << endl;

//system("pause");

getchar();

}

**執行過程讀者優先:

寫者優先:

讀者寫者問題

生產者消費者問題一樣,讀者寫者也是乙個非常著名的同步問題。讀者寫者問題描述非常簡單,有乙個寫者很多讀者,多個讀者可以同時讀檔案,但寫者在寫檔案時不允許有讀者在讀檔案,同樣有讀者在讀檔案時寫者也不去能寫檔案。上面是讀者寫者問題示意圖,類似於生產者消費者問題的分析過程,首先來找找哪些是屬於 等待 情況。...

讀者 寫者問題

讀者 寫者問題 讀者 寫者問題 readers writers problem 也是乙個經典的併發程式設計問題,是經常出現的一種同步問題。計算機系統中的資料 檔案 記錄 常被多個程序共享,但其中某些程序可能只要求讀資料 稱為讀者 reader 另一些程序則要求修改資料 稱為寫者 writer 就共享...

讀者 寫者問題

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...