线程同步问题(100分)

  • 主题发起人 主题发起人 cjmcn-sh
  • 开始时间 开始时间
C

cjmcn-sh

Unregistered / Unconfirmed
GUEST, unregistred user!
哲学家就餐问题中,一组哲学家围坐在一个圆桌旁,每个哲学家的左边都只有一只筷子(当然他的右边也有一只筷子,但是这是他右边哲学家的左边的筷子),他们吃完了就思考,思考了一会就会饿,饿了就想吃,然而,为了吃饭,他们必须获得左边和右边的筷子。当每个哲学家只拿有一只筷子的时候,会坐者等另一只筷子,在每个哲学家都只拿一个筷子的时候,就会发生死锁。求解决的算法!100分。成功立刻发分。
 
文不对题。和操作系统、进程都没关系,只是一个线程同步的问题而已。
 
线程同步 .楼上的会不 ??
帮我做一下。操作系统上课要用的。
 
这不是做互斥量吗
用createmutex()
 
elfer,
能帮我做个例子么??
 
关注下,小弟才疏学浅,还不会写这样的例子,不过这个问题挺有趣的。有大侠指点下小弟愿开300分酬谢,谢了。
 
呵呵,发生死锁的时候还应该随机挑一个线程来Cut掉,这样就解决所有问题了
 
呵呵xfeiffer的方法是可以。可是要求不是这样的。正在想是不是开始只允许5个人中的4个拿筷子。现在还是没有头绪。希望大家帮忙啊
 
你说:你“正在想是不是开始只允许5个人中的4个拿筷子” --- 强啊,这样都可以啊。
既然这样都可以,你为什么不“允许”让五个人中的五个人都拿筷子?
实在不行,你就让他用手抓好了。
 
小雨哥~你强你就做出来。我是菜,但是你也不用这样说,你就是一团屎.避免死锁的一个方法就是5个人中最多只允许4个人同时拿一边的筷子,最后一定能保证其中1位拿到筷子,呵呵。你要真强就做出来~那样佩服你。要不你就是一团屎.
 
来自:小雨哥, 时间:2006-4-22 19:08:36, ID:3423889
你说:你“正在想是不是开始只允许5个人中的4个拿筷子” --- 强啊,这样都可以啊。
既然这样都可以,你为什么不“允许”让五个人中的五个人都拿筷子?
实在不行,你就让他用手抓好了。
十分气愤~!
你怎么能说出这么没有人性的话,可能是我很菜,智商相当低,问题很简单我太傻想不出来,你也要尊重一下我。这样可以么?你是一团屎,这个感觉怎么样???
 
constructor Philosopher.Create;
begin
FreeOnTerminate := True;
FThinking:=True;
inherited Create(True);
end;

procedure Philosopher.Execute;
begin
while Truedo
begin
FThinking:=False;
TakeFooding;
// 有吃的蹭啦
FThinking:=True;
Suspend;
// 一边凉快去吧
end;
end;

procedure Philosopher.TakeFooding;
begin
// 蹭饭进行中 ....
end;
 
constructor Table.Create;
begin
Handle := CreateSemaphore(nil, 0, 1, nil);
FreeOnTerminate := True;
List:=TList.Create;
while List.Count<100do
AddPhilosopher;
Half:=List.Count shr 1;
inherited Create(False);
end;

destructor Table.Destroy;
var
n:integer;
begin
CloseHandle(Handle);
inherited Destroy;
end;

procedure Table.AddPhilosopher;
var
P:PAct;
begin
New(P);
with P^do
begin
Pr:=Philosopher.Create;
Active:=True;
Dinner:=0;
PHandle:=P^.Pr.Handle;
end;
List.Add(P);
end;

procedure Table.Execute;
begin
while Truedo
begin
if List.Count< 1 then
exit;
if WaitForSingleObject(Handle,Random(100))<>WAIT_TIMEOUT then
begin
if (DinnerCount<=Half)and(Index>=0) then
begin
PAct(List[Index])^.Active:=True;
Inc(PAct(List[Index])^.Dinner);
if PAct(List[Index]).Dinner>365 then
// 蹭够了?
begin
TerminateThread(PAct(List[Index]).PHandle,0);
List.Delete(Index);
end else
Next.Resume;
end;
end
else
begin
Next:=NextPhilosopher;
ReleaseSemaphore(Handle,1, nil);
end;
end;
end;

function Table.NextPhilosopher:Philosopher;
var
do
ne: Boolean;
m, n: integer;
Ptr: Pointer;
FList:TList;
begin

FList:=TList.Create;
try
for m:=0 to List.Count-1do
begin
if (PAct(List[m]))^.Active then
if (PAct(List[m]))^.Pr.Thinking then
(PAct(List[m]))^.Active:=False;
if not((PAct(List[m]))^.Active)then
FList.Add(List[m]);
end;
n := FList.Count;
repeat
do
ne := True;
for m := 0 to n - 2do
if (PAct(FList[m]))^.Dinner >(PAct(FList[m+1]))^.Dinner then
begin
ptr := FList[m];
FList[m] := FList[m + 1];
FList[m + 1] := ptr;
do
ne := False;
end;
untildo
ne;
if FList.Count>0 then
begin
Index:=List.IndexOf(FList[0]);
Result:=PAct(List[Index])^.Pr;
end;
finally FList.Free;
end;
end;
 
你让5个人中的4个人先拿筷子,结果是每人 1.25根筷子。你不是有意让他们用手抓还有什么别的深奥的意思在里头呢?
这年头,我这样的疑问都属于“没人性”啦?!
 
佩服你!首先谢谢,不过5个人中有4个人拿了左边的筷子,剩下一根一定是有一个人可以拿到的,这样对么。分先发了,不喜欢拖拖拉拉。另外我的qq43297460
 
这个问题的新贴:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3424226
 
后退
顶部