模拟多进程之间的同步与互斥Word下载.docx

上传人:b****1 文档编号:5823794 上传时间:2023-05-05 格式:DOCX 页数:23 大小:154.89KB
下载 相关 举报
模拟多进程之间的同步与互斥Word下载.docx_第1页
第1页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第2页
第2页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第3页
第3页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第4页
第4页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第5页
第5页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第6页
第6页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第7页
第7页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第8页
第8页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第9页
第9页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第10页
第10页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第11页
第11页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第12页
第12页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第13页
第13页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第14页
第14页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第15页
第15页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第16页
第16页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第17页
第17页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第18页
第18页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第19页
第19页 / 共23页
模拟多进程之间的同步与互斥Word下载.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

模拟多进程之间的同步与互斥Word下载.docx

《模拟多进程之间的同步与互斥Word下载.docx》由会员分享,可在线阅读,更多相关《模拟多进程之间的同步与互斥Word下载.docx(23页珍藏版)》请在冰点文库上搜索。

模拟多进程之间的同步与互斥Word下载.docx

通过进程的重复申请资源,来模拟唤醒功能。

用到的主要函数:

1、主进程部分

功能部分:

(1)根据线程的请求分配资源:

将该资源分配给申请线程,同时显示一下分配情况;

如果值小于0,则表示等待分配资源状态;

调功能(3)显示状态信息;

(2)根据线程的请求释放资源:

如果进程使用资源结束,则将资源数加1,若小于0,则唤醒一个等待的进程,并调功能(3)显示状态信息;

(3)显示状态:

如当前的状态,临界区资源的个数等;

数据部分:

(1)要创建线程的名称列表(线程的名字不能相同);

(2)用一个整形变量来模拟临界区资源的个数;

2、子线程部分

(1)申请资源:

向主线程申请资源,如果成功,进入资源并利用,如果不成功,循环等待并SLEEP,重试n次后仍没有资源可利用,线程终止(以免死锁)并报错误信息

(2)模拟使用:

申请得资源后,随机使用一段时间

(3)申请释放;

释放资源要向主进程提供申请,如果成功,那么停止,如果不成功,循环等待并SLEEP,如果重试n次后仍然无法释放资源,则报错误信息并终止;

(1)线程的名称,由线程创建时由主线程指定;

(2)运行时间,等待时间,重试次数,由创建的指定;

(3)休眠时间:

如果申请不到资源或不能申请退出等待的时间

(4)显示的信息列表:

显示的信息有线程名,运行时间,重试次数,现在状态等情况

 

2.3整体框图

2.4局部框图

调用过程execute(),运行线程

K:

=0

Repeat

Until

K>

retrytime

Synchronize(wantsource)

iswantsource

true

False

break

Sleep(waittime)

Inc(k)

k>

Synchronize(self.showerror)

Self.terminate;

exit

Synchronize(wantsourceok)

Sleep(times)

I:

Repeat

i>

Synchronize(donwantsource)

isdonwantsource

True

Break

sleep(waitTime);

Inc(i);

synchronize(self.ShowErrorEx);

self.Terminate;

synchronize(donWantSourceOk);

synchronize(EndThisRun);

过程Wantsource()

//申请资源

strToint(edtuse.text)-1<

0

k=0

false

edtuse.Text

:

=intTostr

(strToint(edtuse.text)-1);

self.isWantSource:

=false;

edtuse.Tex

t:

=intTostr(strToint(edtuse.text)-1);

=True;

self.isWantSource

AddinfoTolvinfo(ListIndex,'

申请资源成功'

);

Addinfo(format('

进程%s试图申请资源---当前还有可用资源,申请成功'

[strname]));

申请资源失败'

进程%s试图申请资源---临界资源没有了,申请失败,等待%d毫秒再试'

[strname,waittime]));

过程donwantsource()

//释放资源

isDonotWantSource:

=notCheckBox1.checked;

isDonotWantSource

edtuse.Text:

=intTostr(strToint(edtuse.text)+1);

释放资源成功'

进程%s试图释放资源---资源尚未锁定,释放成功'

释放资源失败'

进程%s试图释放资源---'

资源被用户锁定,释放失败,等待%d毫秒再试'

[waittime]));

ShowError()

//在允许进程释放资源的情况下,重试次数超过预定的

edtuse.text:

=intTostr(strToint(edtuse.text)+1);

addinfoTolvinfo(ListIndex,'

超时错误并停止'

addinfo(format('

进程%s经过%d次重试,仍然没有成功,超时并终止线程'

[strName,RetryTime]));

ShowErrorEx()

//在不允许进程释放资源的情况下,重试次数超出。

强制进程释放资源

进程%s经过%d次重试,用户仍然锁定不准释放资源---'

addinfo('

为了防止死锁,强制释放并终止线程'

=intTostr(strToint(edtuse.text)+1);

运行前:

运行中:

当进程被强制不能释放资源时:

当重试次数超过设定的次数时,会终止进程;

四、遇到的主要问题

1、进程申请资源时,先使资源数减1,若小于0,则表示临界资源不够,资源申请失败。

此时,进程会等待一定的时间之后去重试申请资源(模拟唤醒进程操作),在这个时候资源数是不能再减1的。

因为第一次已经表示有分配资源了。

同样,在等待的过程中,若有进程释放了资源,此时申请分配资源,也不能够再减1。

通过定义一个全局变量k,当k=0的时候,表示第一次申请资源;

否则,当k>

0,则意味着已经该进程在重试申请资源,此时不再执行资源个数减1的操作了。

2、当Tedit控件中的内容为空时,使用函数strtoint(),将Tedit控件中的内容转换为整形则会出错,所以在这个属性中默认一个初值0,这样就可以解决这个问题了。

unituMain;

interface

uses

Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,

Dialogs,ExtCtrls,StdCtrls,ComCtrls,Buttons,Spin;

type

TMain=class(TForm)

GroupBox1:

TGroupBox;

lbox:

TListBox;

Panel1:

TPanel;

StatusBar1:

TStatusBar;

GroupBox3:

GroupBox4:

Label3:

TLabel;

Label4:

btnCreate:

TBitBtn;

edtName:

TEdit;

Label5:

Label6:

GroupBox5:

Label8:

edtSource:

edtUse:

Label9:

lvInfo:

TListView;

Splitter1:

TSplitter;

Label2:

Label7:

Label10:

CheckBox1:

TCheckBox;

edtWaitTime:

edtTimes:

edtRetry:

procedurebtnCreateClick(Sender:

TObject);

private

{Privatedeclarations}

public

procedureAddInfoTolvinfo(index:

integer;

s:

string);

procedureAddInfo(s:

{Publicdeclarations}

end;

TDemoProcedure=class(TThread)

ListIndex:

strName:

string;

WaitTime,RetryTime,Times:

Integer;

isWantSource:

boolean;

//申请资源标志

isDonotWantSource:

//释放资源标志

constructorCreate();

protected

procedureExecute;

override;

procedureWantSource;

procedureWantsourceok;

proceduredonWantSource;

proceduredonWantsourceOK;

procedureEndThisRun;

procedureShowError;

procedureShowErrorEx;

//释放资源被锁定,强制释放以防死锁

const

sRun='

运行状态'

;

sWait='

申请资源'

sWaitOk='

申请资源成功,进行使用期'

sExit='

申请释放资源'

sExitOk='

释放资源ok'

var

k:

integer;

Main:

TMain;

implementation

{$R*.dfm}

procedureTMain.btnCreateClick(Sender:

waitTime,Retry,Times:

p:

TListitem;

isMore:

//判断该进程是否已存在

i:

DemoProcedure:

TDemoProcedure;

begin

strName:

=Trim(edtName.Text);

waitTime:

=strToint(Trim(edtWaitTime.Text));

Retry:

=strToint(Trim(edtRetry.Text));

Times:

=strToint(Trim(edtTimes.Text));

ifTrim(edtName.Text)='

'

then

beginShowMessage('

模拟进程的名称不能为空'

edtName.SetFocus;

exit;

if(WaitTime<

=0)then

等待时间不能为空,且要大于0'

edtWaitTime.SetFocus;

exit;

if(Times<

beginshowMessage('

运行时间不能为空,且要大于0'

edtTimes.SetFocus;

end;

if(Retry<

重试次数不能少于0'

edtRetry.SetFocus;

isMore:

fori:

=0tolvinfo.Items.Count-1do

begin

iflvinfo.Items[i].Caption=strNamethen

beginisMore:

=true;

break;

ifisMorethen

模拟进程的名称要唯一'

withlvinfodo//如果成功,写入进程信息列表中

p:

=Items.Add;

p.Caption:

=strname;

p.SubItems.Add(intTostr(waitTime));

p.SubItems.Add(intTostr(Retry));

p.SubItems.Add(sRun);

i:

=lvInfo.Items.Count-1;

//创建模拟进程

DemoProcedure:

=TDemoProcedure.Create();

//创建进程

DemoProcedure.strName:

=strName;

DemoProcedure.Times:

=Times*1000;

DemoProcedure.ListIndex:

=i;

DemoProcedure.WaitTime:

=waitTime*1000;

DemoProcedure.RetryTime:

=Retry;

DemoProcedure.Resume;

//runthethread

procedureTMain.AddInfotoLvinfo(index:

iflvinfo.Items.Count-1<

indexthenexit;

ifindex<

0thenexit;

lvinfo.Items[index].SubItems[2]:

=s;

;

procedureTMain.AddInfo(s:

lbox.Items.Add(s);

//Application.ProcessMessages;

{TDemoProcedure}

constructorTDemoProcedure.Create;

FreeOnTerminate:

inheritedCreate(True);

procedureTDemoProcedure.donWantSource;

withMaindo

isDonotWantSource:

ifisDonotWantSourcethen

//释放资源

edtuse.Text:

AddinfoTolvinfo(ListIndex,'

Addinfo(format('

end

else

procedureTDemoProcedure.donWantsourceOK;

//将相关信息写入信息框

释放资源'

进程%s成功释放资源---释放资源后马上会自动终止本进程'

procedureTDemoProcedure.ShowError;

edtuse.text:

addinfoTolvinfo(ListIndex,'

addinfo(format('

procedureTDemoProcedure.ShowErrorEx;

addinfo('

edtuse.Text:

procedureTDemoProcedure.WantSource;

ifstrToint(edtuse.text)-1<

0then

ifk=0then//首次申请资源,同一个进程重复第二次申请时,不应该再减1了

self.isWantSource:

ifk=0then//首次申请资源。

当k!

=0的时候表明是在重复申请资源的过程中

//有了可用资源了,此时不应该再减1!

!

所以有控制语句

ifself.isWantSourcethen//申请到了资源

else//资源正被其他进程在使用

//添加到进程信息表中

//添加相关信息到状态显示框中

procedureTDemoProcedure.Wantsourceok;

使用资源状态'

进程%s成功申请资源---正在使用过程中,将运行%d毫秒'

[strname,times]));

procedureTDemoProcedure.Execute;

k:

=0;

repeat

synchronize(WantSource);

//主线程将synchronize中参数过程放入到消息队列中,然后逐个的响应这些消息

//而实现进程之间的同步

ifisWantSourcethenbreak//申请到了资源

else//资源正在被其他进程使用

sleep(waitTime);

Inc(k);

until(k>

=retrytime);

ifk>

=retrytimethen

begin//未申请到资源退出

synchronize(self.ShowError);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2