国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

用信號量機(jī)制解決讀者-寫者問題C語言實現(xiàn)

這篇具有很好參考價值的文章主要介紹了用信號量機(jī)制解決讀者-寫者問題C語言實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

文章目錄

  • 介紹
  • 一、什么是進(jìn)程同步,進(jìn)程互斥
  • 二、讀者-寫者問題概述
    • 1.概念圖
    • 2.實例代碼
  • 總結(jié)

介紹

通過實驗?zāi)M讀者和寫者之間的關(guān)系,了解并掌握他們之間的關(guān)系及其原理。由此增加對進(jìn)程同步的問題的了解。具體如下:
? 1)掌握基本的同步互斥算法,理解讀者和寫者模型;
? 2)了解windows中多線程(多進(jìn)程)的并發(fā)執(zhí)行機(jī)制,線程(進(jìn)程)間的同步和互斥;
? 3)學(xué)習(xí)使用windows中基本的同步對象,掌握相應(yīng)的API。


提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、什么是進(jìn)程同步,進(jìn)程互斥

進(jìn)程同步:對多個并發(fā)的進(jìn)程在執(zhí)行次序上進(jìn)行協(xié)調(diào),使其能按照一定的規(guī)則共享資源系統(tǒng),使程序的執(zhí)行有可在現(xiàn)性

進(jìn)程互斥:間接相互制約關(guān)系,由于共享資源的征用問題,系統(tǒng)實施統(tǒng)一的分配,使并發(fā)的程序之間有相互制約關(guān)系

二、讀者-寫者問題概述

1.概念圖

操作系統(tǒng)c語言完成讀者寫者問題模擬,操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu),c語言,c++

? ? ? 調(diào)試一個采用“讀寫平等”策略的“讀者-寫者”問題的模擬程序。

利用模擬用信號量機(jī)制實現(xiàn)讀者和寫者問題:通過用戶控制讀進(jìn)程和寫進(jìn)程,反應(yīng)讀者和寫者問題中所涉及的進(jìn)程的同步與互斥

?問題描述:

? ? ? 模擬用信號量機(jī)制實現(xiàn)讀者和寫者問題,即有兩組并發(fā)進(jìn)程:讀者和寫者,共享一組數(shù)據(jù)區(qū),進(jìn)行讀寫操作,要求任一時刻“寫者”最多只允許一個,而“讀者”則允許多個。

?規(guī)則說明:

允許多個讀者同時執(zhí)行讀操作;

不允許讀者、寫者同時操作;

不允許多個寫者同時操作。

問題分析:

互斥關(guān)系:寫進(jìn)程-寫進(jìn)程,讀進(jìn)程-寫進(jìn)程

設(shè)置一個p(rw),V(rw),實現(xiàn)對共享文件的枷鎖和解鎖,讀進(jìn)程和讀進(jìn)程之間要同時訪問,寫進(jìn)程和讀進(jìn)程之間要互斥訪問,可以讓第一個讀進(jìn)程枷鎖,最后一個讀進(jìn)程解鎖,設(shè)置一個變量count來記錄有幾個讀進(jìn)程在訪問。

寫者進(jìn)程:

操作系統(tǒng)c語言完成讀者寫者問題模擬,操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu),c語言,c++

讀者進(jìn)程

操作系統(tǒng)c語言完成讀者寫者問題模擬,操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu),c語言,c++

?

?

2.實例代碼

#include<iostream>
#include<string>
using namespace std;
int r_num;//讀者個數(shù)
int w_num;//寫者個數(shù)
int Wmutex=1;//表示允許寫或允許讀
int Rcount=0;//表示正在讀的進(jìn)程數(shù)
int Rmutex=1;//表示對Rcount的互斥操作
int r[10]={0,0,0,0,0,0,0,0,0,0};//表示讀者的狀態(tài),1表示正在讀
int w[10]={0,0,0,0,0,0,0,0,0,0};//表示寫者的狀態(tài),1表示正在寫
int w_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//表示等待隊列,0-9表示寫者,10時需引入讀者的等待隊列,-1表示空
int r_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//讀者的等待隊列,0-9表示對應(yīng)的讀者,-1為空
void write_p(int i);//模擬寫者對Wmutex的P操作,同時也作為寫者進(jìn)程的入口
void write(int i);//開始寫操作
void write_v(int i);//模擬寫者對Wmutex的V操作,寫操作完成的時候調(diào)用
void radd_p(int i);//模擬讀之前對Rmutex的P操作,同時也作為讀者進(jìn)程的入口
void radd(int i);//Rcount加1
void read_p(int i);//模擬讀者對Wmutex的P操作
void radd_v(int i);//模擬讀之前對Rmutex的V操作
void read(int i);//讀
void rsub_p(int i);//模擬讀之后對Rmutex的P操作,讀操作完成的時候調(diào)用
void rsub(int i);//Rcount減1
void read_v(int i);//模擬讀者對Wmutex的V操作
void rsub_v(int i);//模擬讀之后對Rmutex的V操作
void write(int i)
{
	w[i]=1;
}

void write_p(int i)
{
	Wmutex--;
	if(Wmutex<0)     //表示如果Wmutex<0,則該寫者進(jìn)入等待隊列
	{
		w_wait[-Wmutex-1]=i;
	}
	else
		write(i);
}

void write_v(int i)
{
	w[i]=0;
	Wmutex++;
	if(Wmutex<=0)    	//表示如果Wmutex<=0,則從等待隊列中選擇寫者或讀者進(jìn)行操作
	{
		int k,j;
		if((w_wait[0]>=0)&&(w_wait[0]<w_num))
		{
			j=w_wait[0];
			for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
			write(j);
		}
		else
		{		
			j=r_wait[0];
			for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
			for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1];
			radd_v(j);		
		}
	}
}

void radd_p(int i) {
	Rmutex--;
	if(Rmutex<0)         //表示如果Rmutex<0,則進(jìn)入等待隊列
	{
		r_wait[-Rmutex]=i;
	}
	else
		radd(i);
}

void radd(int i)
{
	Rcount++;
	if(Rcount==1)
		read_p(i);
	else
		radd_v(i);
}

void read_p(int i)
{
	Wmutex--;
	if(Wmutex<0)         //表示如果Wmutex<0,則進(jìn)入等待隊列
	{
		w_wait[-Wmutex-1]=10;
		r_wait[0]=i;
	}
	else
		radd_v(i);
}

void radd_v(int i)
{
	Rmutex++;
	
	if(Rmutex<=0)  //表示如果Rmutex<=0,則從等待隊列中選擇讀者進(jìn)入Rcount的臨界區(qū)
	{
		int k,j;
		j=r_wait[0];
		for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1];
		radd(j);
	}
	read(i);
}

void read(int i)
{
	r[i]=1;
}
void rsub_p(int i)    
{
	r[i]=0;
	Rmutex--;
	rsub(i);
}
void rsub(int i)
{
	Rcount--;
	if(Rcount==0)
		read_v(i);
	else
		rsub_v(i);
}
void read_v(int i) {
	Wmutex++;
	if(Wmutex<=0)     //表示如果Wmutex<=0,則從等待隊列中選擇寫者或讀者進(jìn)行操作
	{
		int k,j;
		if((w_wait[0]>=0)&&(w_wait[0]<w_num))
		{
			j=w_wait[0];
			for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
			write(j);
		}
		else
		{		
			j=r_wait[0];
			for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1];
			for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1];
			radd_v(j);		
		}
	}
	rsub_v(i);
}
void rsub_v(int i)
{
	Rmutex++;
}

int main()
{
	cout<<"請輸入寫者個數(shù)(1到10):";
	cin>>w_num;
	while(w_num<1||w_num>10)
	{
		cout<<"輸入有誤,請重新輸入寫者個數(shù)(1到10):";
		cin>>w_num;
	}//完成對寫者個數(shù)的輸入
	cout<<"請輸入讀者個數(shù)(1到10):";
	cin>>r_num;
	while(r_num<1||r_num>10)
	{
		cout<<"輸入有誤,請重新輸入讀者個數(shù)(1到10):";
		cin>>r_num;
	}//完成對讀者個數(shù)的輸入
    int x,k,j,a[20];
	while(1)
	{
		cout<<"************************************"<<endl;
		for(k=0;k<20;k++) a[k]=0;
        cout<<"Wmutex="<<Wmutex<<"Rcount="<<Rcount<<" Rmutex="<<Rmutex<<endl;
		for(k=0;k<w_num;k++)
		{
			if(w[k]==1)
				cout<<"-------寫者"<<(k+1)<<"正在寫"<<endl;
		}
		for(k=0;k<r_num;k++)
		{
			if(r[k]==1)
				cout<<"-------讀者"<<(k+1)<<"正在讀"<<endl;
		}
if(w_wait[0]==-1) cout<<"等待隊列中無對象"<<endl;
		else 
		{
			cout<<"等待隊列中有:";
			for(k=0;k<w_num;k++)
			{
				if(w_wait[k]==10)
					for(j=0;j<5;j++)
					{
						if(r_wait[j]!=-1)
							cout<<"-->"<<"讀者"<<(r_wait[j]+1);
					}
					if((w_wait[k]>=0)&&(w_wait[k]<w_num))
						cout<<"-->"<<"寫者"<<(w_wait[k]+1);
			}
			cout<<endl;
		}
			for(k=0;k<w_num;k++)
		{
			x=0;
			for(j=0;j<w_num;j++)
			{
				if(k==w_wait[j])
				{
					a[k]=1;
					x=1;
				}
			}
			if(x==1) continue;
			cout<<"("<<(k+1)<<")寫者"<<(k+1);
			if(w[k]==0) cout<<"申請  ";
			else cout<<"完成  ";
		}
for(k=0;k<r_num;k++)
		{
			x=0;
			for(j=0;j<r_num;j++)
			{
				if(k==r_wait[j])
				{
					a[k+w_num]=1;
					x=1;
				}
			}
			if(x==1) continue;
			cout<<"("<<(k+1+w_num)<<")讀者"<<(k+1);
			if(r[k]==0) cout<<"申請  ";
			else cout<<"完成  ";
		}
		cout<<"("<<(w_num+r_num+1)<<")結(jié)束"<<endl;
                cout<<"請輸入選項序號:";
		cin>>x;
while(x<1||x>(w_num+r_num+1)||a[x-1]==1)
		{
			if(a[x-1]==1) cout<<"該對象已在等待隊列中,請重新輸入:";
			else cout<<"輸入有誤,請重新輸入:";
			cin>>x;	
		}
		for(k=0;k<w_num;k++)
		{
			if(x==(k+1))
			{
				if(w[k]==0) write_p(k);
				else write_v(k);
				break;
			}
		}
		for(k=0;k<r_num;k++)
		{
			if(x==(k+1+w_num))
			{
				if(r[k]==0) radd_p(k);
				else rsub_p(k);
				break;
			}
		}
		if(x==(w_num+r_num+1)) return 0;
	}
}

總結(jié)

喜歡的話,點(diǎn)個關(guān)注吧文章來源地址http://www.zghlxwxcb.cn/news/detail-787725.html

到了這里,關(guān)于用信號量機(jī)制解決讀者-寫者問題C語言實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • iOS開發(fā)進(jìn)階(六):Xcode14 使用信號量造成線程優(yōu)先級反轉(zhuǎn)問題修復(fù)

    iOS開發(fā)進(jìn)階(六):Xcode14 使用信號量造成線程優(yōu)先級反轉(zhuǎn)問題修復(fù)

    應(yīng)用 Xcode 14.1 進(jìn)行項目編譯時,遇到以下錯誤提示,導(dǎo)致APP線程暫停。 以上問題是由于iOS信號量造成線程優(yōu)先級反轉(zhuǎn),在并發(fā)隊列使用信號量會可能會造成線程優(yōu)先級反轉(zhuǎn)。 經(jīng)過查詢資料,發(fā)現(xiàn)是在 XCode14 上增加了工具,比如 : Thread Performance Checker ( XCode14 上默認(rèn)開啟的)

    2024年02月01日
    瀏覽(38)
  • 【設(shè)計模式】C語言使用共享內(nèi)存和信號量,完美實現(xiàn)生產(chǎn)者與消費(fèi)者模式

    生產(chǎn)者和消費(fèi)者模式適用于生產(chǎn)者和消費(fèi)者之間存在數(shù)據(jù)交換的場景。在這種模式中,生產(chǎn)者負(fù)責(zé)生產(chǎn)數(shù)據(jù)并將其放入緩沖區(qū),而消費(fèi)者負(fù)責(zé)從緩沖區(qū)中取出數(shù)據(jù)并進(jìn)行處理。這種模式的優(yōu)點(diǎn)是可以實現(xiàn)生產(chǎn)者和消費(fèi)者之間的解耦,使得它們可以獨(dú)立地進(jìn)行操作,從而提高了

    2024年02月03日
    瀏覽(20)
  • 【Linux C | 多線程編程】線程同步 | 信號量(無名信號量) 及其使用例子

    【Linux C | 多線程編程】線程同步 | 信號量(無名信號量) 及其使用例子

    ??博客主頁??:??https://blog.csdn.net/wkd_007?? ??博客內(nèi)容??:??嵌入式開發(fā)、Linux、C語言、C++、數(shù)據(jù)結(jié)構(gòu)、音視頻?? ??本文內(nèi)容??:??介紹 ?? ??金句分享??:??你不能選擇最好的,但最好的會來選擇你——泰戈爾?? ?發(fā)布時間?: 本文未經(jīng)允許,不得轉(zhuǎn)發(fā)!?。?/p>

    2024年04月26日
    瀏覽(27)
  • 【Linux從入門到精通】信號量(信號量的原理與相關(guān)操作接口)詳解

    【Linux從入門到精通】信號量(信號量的原理與相關(guān)操作接口)詳解

    ? 本篇文章重點(diǎn)對 信號量的概念,信號量的申請、初始化、釋放、銷毀等操作進(jìn)行講解。同時舉例把信號量應(yīng)用到生產(chǎn)者消費(fèi)者模型來理解 。希望本篇文章會對你有所幫助。 目錄 一、信號量概念 1、1 什么是信號量 1、2 為什么要有信號量 1、3 信號量的PV操作 二、信號量的相

    2024年02月08日
    瀏覽(58)
  • uCOSii信號量

    uCOSii信號量

    uCOSii 信號量 主要用來測試使用uCOSii“創(chuàng)建信號量,發(fā)送信號量,接收信號量,刪除信號量”。 學(xué)習(xí)uCOSii一定要先了解os_cfg.h文件。 信號量管理函數(shù)如下: OSSemAccept () 無條件地等待請求一個信號量函數(shù),中斷服務(wù)子程序只能用OSSemAccept()而不能用OSSemPend(),因為中斷服務(wù)子程序是不

    2024年02月07日
    瀏覽(20)
  • linux(信號量)

    linux(信號量)

    1.回顧信號量的概念 2.認(rèn)識信號量對應(yīng)的操作函數(shù) 3.認(rèn)識一個環(huán)形隊列 4.結(jié)合sem+環(huán)形隊列寫生產(chǎn)者消費(fèi)者模型 --------------------------------------------------------------------------------------------------------------------------------- 1.回顧信號量的概念 ?每個人想進(jìn)放映廳看電影,第一件事就是買票

    2024年02月11日
    瀏覽(42)
  • 信號量Semaphore詳解

    信號量Semaphore詳解

    大家應(yīng)該都用過 synchronized 加鎖,用來保證某個時刻只允許一個線程運(yùn)行。那么如果控制某個時刻允許指定數(shù)量的線程執(zhí)行,有什么好的辦法呢? 答案就是JUC提供的信號量 Semaphore 。 Semaphore (信號量)可以用來限制能同時訪問共享資源的線程上限,它內(nèi)部維護(hù)了一個 許

    2024年02月14日
    瀏覽(18)
  • 信號量

    信號量

    信號量(semaphore)和信號只有一字之差,卻是不同的概念, 信號量與之前介紹的IPC不同,它是一個計數(shù)器,用于實現(xiàn)進(jìn)程間的互斥于同步 本文參考: Linux 的信號量_linux 信號量_行孤、的博客-CSDN博客 【Linux】Linux的信號量集_Yngz_Miao的博客-CSDN博客 Linux進(jìn)程間通信(九)——信

    2024年02月12日
    瀏覽(31)
  • linux信號量

    linux信號量

    通過學(xué)習(xí)linux的信號量,對linux的信號量進(jìn)行了編程。

    2024年02月10日
    瀏覽(20)
  • FreeRTOS教程5 信號量

    正點(diǎn)原子stm32f407探索者開發(fā)板V2.4 STM32CubeMX軟件(Version 6.10.0) Keil μVision5 IDE(MDK-Arm) 野火DAP仿真器 XCOM V2.6串口助手 一個滑動變阻器 本文主要學(xué)習(xí) FreeRTOS 信號量的相關(guān)知識, 包括創(chuàng)建/刪除信號量、釋放信號量、獲取信號量等知識 信號量是進(jìn)程間用于通信的一種手段,其是

    2024年03月15日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包