一个多线程的临界问题。 ( 积分: 100 )

  • 主题发起人 主题发起人 qiubole
  • 开始时间 开始时间
Q

qiubole

Unregistered / Unconfirmed
GUEST, unregistred user!
有人在吗?请教一个多线程问题
在线程中.
while not Terminateddo
begin
try
EnterCriticalSection(SystemSetup.FSaleUpLock);
Self.Synchronize(DoUpdateSale);
finally
LeaveCriticalSection(SystemSetup.FSaleUpLock);
end;
Sleep(100);
end;

在主线程中
while Truedo
begin
TradeData.DNo := IntToStr(GetTickCount);
try
EnterCriticalSection(SystemSetup.FSaleUpLock);
SystemSetup.Log.WriteLog('准备写入TXT');
TextBak.begin
Write;
WriteToTableA;
WriteToTableB;
WriteToTableC;
SystemSetup.Log.WriteLog('准备关闭Txt备份');
TextBak.EndWirte;
finally
LeaveCriticalSection(SystemSetup.FSaleUpLock);
end;
end;

竟然会死锁,这是怎么回事
 
有人在吗?请教一个多线程问题
在线程中.
while not Terminateddo
begin
try
EnterCriticalSection(SystemSetup.FSaleUpLock);
Self.Synchronize(DoUpdateSale);
finally
LeaveCriticalSection(SystemSetup.FSaleUpLock);
end;
Sleep(100);
end;

在主线程中
while Truedo
begin
TradeData.DNo := IntToStr(GetTickCount);
try
EnterCriticalSection(SystemSetup.FSaleUpLock);
SystemSetup.Log.WriteLog('准备写入TXT');
TextBak.begin
Write;
WriteToTableA;
WriteToTableB;
WriteToTableC;
SystemSetup.Log.WriteLog('准备关闭Txt备份');
TextBak.EndWirte;
finally
LeaveCriticalSection(SystemSetup.FSaleUpLock);
end;
end;

竟然会死锁,这是怎么回事
 
感觉会发生死锁现象!不过原因我说不上来,sync是通过消息机制在主线程中执行的。
 
通过看源代码,发现在sync的过程中,也进入临界区进行操作。应该是这个原因造成的吧。
 
Self.Synchronize(DoUpdateSale);
时,原来的主线程就停止执行了,直到DoUpdateSale这段程序执行完毕,所以要检查DoUpdateSale里是否会造成死锁
 
Synchronize 是的过程是在主线程的Application对象在Idle过程里执行的,
如果你的主线程一直处于while true ..do这种死循环中,Synchronize 的过程就
永远也不会执行。
这就是造成死锁的原因。
 
解决的方法有把你while true..do 中的代码放在一个Timer的Ontimter事件中执行,
或者放在另一个线程中执行。
 
啊,Q老师,我是风神啊!你怎么会遇上死锁了.呵呵.这个东西比较麻烦啊,读写问题,哲学家就餐问题,想来就头疼!!呵..
 

Similar threads

后退
顶部