доброе время суток. Хочу сказать что подобная тема уже есть, но прочитав её я не понял из неё не чего и ещё, материалы которые выложены в той теме работают не корректно. | Цитата | В пансионе отдыхают и предаются размышлениям 5 философов (потоки), пронумерованные от 1 до 5. В столовой расположен круглый стол, вокруг которого расставлены 5 стульев, также пронумерованные от 1 до 5. На столе находится одна большая тарелка со спагетти, которая пополняется бесконечно, также там расставлены 5 тарелок, в которые накладывается спагетти, и 5 вилок (разделяемые ресурсы), назначение которых очевидно. Для того чтобы пообедать, философ входит в столовую и садится на любой стул. При этом есть философ сможет только в том случае, если свободны две вилки – справа и слева от его тарелки. При выполнении этого условия философ поднимает одновременно обе вилки и может поглощать пищу в течение какого-то заданного времени. В противном случае, философу приходится ждать освобождения обеих вилок. Пообедав, философ кладет обе вилки на стол одновременно и уходит. Описанный процесс происходит бесконечно. Воспользоваться объектами синхронизации типа «событие».
|
Логику задания я понял, как что происходит тоже, но как все перевести в жизнь машины не могу понять, уже проэксперементировал со всем... так эксперементил что в нижнем исходнике столько всего лишнего стало.... | Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button2: TButton; Button3: TButton; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Memo1Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
const max_=4; var Form1 : TForm1; idThread : DWORD; h : array[0..max_] of THandle;//философы s1,s2 : DWORD;
Event1 : array [0..max_] of THandle;//вилки state : array [0..max_] of byte;//состояние can_eat : array [0..max_] of byte; forks : array [0..max_] of byte; philos : array [0..max_] of byte;//философы site : array [0..max_] of byte; Pos_styl : array [0..max_] of byte; implementation
{$R *.dfm} const Eating = 0; // ест SitUp = 2; // встал
procedure pickup(pos:byte); begin if(state[pos]=0)then exit; if (state[pos] <> Eating) and (state[(pos+1) mod 5] <> Eating)then begin state[pos]:= Eating; state[(pos+1) mod 5]:=Eating; end; if state[pos] <> Eating then exit; end;
procedure Up(pos:byte); begin state[pos]:= SitUp; state[(pos+1) mod 5]:=SitUp; end; procedure Disable_(site1,site2:integer;flag:boolean); var i:byte; begin if(site2 = -1)then site2:=max_; if(flag = false)then begin if(Pos_styl[site1]<> 1)and(Pos_styl[site2]<> 1)then begin Pos_styl[site1]:=1; Pos_styl[site2]:=1; end else begin //exit;//??? end; end else begin for i:=0 to max_ do begin Pos_styl[i]:=0; end; end; end; function philosopher (i:integer):DWORD;stdcall; var pos:byte; begin pos:=random(max_); WaitForSingleObject (Event1[pos], INFINITE); //WaitForSingleObject (Event1[pos-1], INFINITE); { pickup(pos); Sleep(random(5000)); up(pos); } Sleep(random(5000)); Disable_(pos,pos-1,false); //SetEvent (Event1[pos-1]); SetEvent (Event1[pos]); philosopher := i; end; ///////////////// function whatphilos:boolean; var i:byte; flag:boolean; begin flag:=true; for i:=0 to max_ do begin if(site[i]=5)then begin flag:=false; end; end; whatphilos:=flag; end; ///////////////// procedure TForm1.Button2Click(Sender: TObject);
var i,j: integer; fix: bool; counter: integer;
temp_fil: array [0..max_] of byte; flag:boolean; begin randomize; fix:=false; for j:=0 to max_ do begin Event1[j] := CreateEvent (nil, FALSE,true, 'Event'); end;
while (fix=false) do begin for j:=0 to max_ do begin temp_fil[j]:=0; end; for counter:=0 to max_ do begin flag:=false; repeat i:=random(5); if(i=5)then i:=max_; if(temp_fil[i]=0)then begin flag:=true; site[counter]:=i; temp_fil[i]:=1; end; until flag = true; h[counter] := CreateThread (nil, 0, @philosopher, Pointer (i),0, idThread); Memo1.Lines.add('Филосов '+IntToStr(i+1)+' пошел'); end; for j:=0 to max_ do begin temp_fil[j]:=0; end;
i:=1; while(whatphilos = true)do begin Memo1.Lines.add('--------------------------------------'); Memo1.Lines.add('Филосов '+IntToStr(site[i]+1)+' кушает'); if(i<>max_+1)then Memo1.Lines.add('Филосов '+IntToStr(site[i+1]+1)+' кушает'); WaitForSingleObject (h[i], INFINITE);//первый пошел if(i<>max_+1)then WaitForSingleObject (h[i+1], INFINITE);//воторой пошел Disable_(1,2,true); GetExitCodeThread (h[i], s1); if(i<>max_+1)then GetExitCodeThread (h[i+1], s2); CloseHandle(h[i]); if(i<>max_+1)then CloseHandle(h[i+1]); site[i]:=max_+1; if(i<>max_+1)then site[i+1]:=max_+1; Memo1.Lines.add('Филосов '+IntToStr(s1+1)+' поел'); if(i<>max_+1)then Memo1.Lines.add('Филосов '+IntToStr(s2+1)+' поел'); Memo1.Lines.add('--------------------------------------'); i:=i+2; end; {for i:=0 to 4 do begin Memo1.Lines.add('--------------------------------------'); Memo1.Lines.add('Филосов '+IntToStr(site[i]+1)+' кушает'); WaitForSingleObject (h[i], INFINITE); GetExitCodeThread (h[i], s1); Memo1.Lines.add('Филосов '+IntToStr(s1+1)+' поел'); Memo1.Lines.add('--------------------------------------'); CloseHandle(h[i]); end;} Sleep(1000); end; for j:=0 to max_ do begin CloseHandle (Event1[j]); end; end;
procedure TForm1.Button3Click(Sender: TObject); begin form1.close; end;
procedure TForm1.Memo1Click(Sender: TObject); begin Memo1.Clear; end;
end.
|
мой запутанный код, в котором я потерялся.(
|