首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

WaitForMultipleObjects死锁,该如何解决

2013-01-08 
WaitForMultipleObjects死锁现开发的程序里有三个线程,第一个和第二个线程分别读取数据,当两个线程都完成

WaitForMultipleObjects死锁
现开发的程序里有三个线程,第一个和第二个线程分别读取数据,当两个线程都完成读取数据后,将由第三个线程执行数据对比的操作,下面是一些伪代码
第一个线程
while b_Z_Stop = False do
begin
  SetEvent(handles[1]);
  WaitForSingleObject(hConnectedEvent,INFINITE);//等待第三个线程执行结束
end;
第二个线程
while b_Z_Stop = False do
begin
  SetEvent(handles[0]);
  WaitForSingleObject(hConnectedEvent1,INFINITE);//等待第三个线程执行结束
end;
第三个线程
while b_Z_Stop = False do
begin
  WaitForMultipleObjects(2,Pointer(@handles[0]),True,INFINITE);//等待第一、二个线程执行结束
  SetEvent(hConnectedEvent);
  SetEvent(hConnectedEvent1);
end;

程序启动时,有时会没响应,不知道是什么问题,请大家赐教,谢谢
[解决办法]
线程方面不太明白,学习一下
[解决办法]
第一和第二个都等待第三个,怎么等待的句柄还不一样呢,而且不知道你这三个线程是如何初始的,谁先被开始呢,这几行伪代码根本说明不了问题
[解决办法]
主进程:
建立几个不发信号的Event, EventForThread1Wait,EventForThread2Wait, EventForThread3Wait_1,EventForThread3Wait_2;
建立线程一 二 三;

准备数据;

SetEvent(EventForThread1Wait);
SetEvent(EventForThread2Wait);

第一个线程
while b_Z_Stop = False do
begin
    WaitForSingleObject(EventForThread1Wait,...);//等待可读取数据Event
    //读取数据
     SetEvEnt(EventForThread3Wait_1);
end;

第二个线程
while b_Z_Stop = False do
begin
    WaitForSingleObject(EventForThread2Wait,...);//等待可读取数据Event
    //读取数据
     SetEvEnt(EventForThread3Wait_2);
end;

第三个线程
while b_Z_Stop = False do
begin
  WaitForMultipleObjects(2,Pointer(@handles[0]),True,INFINITE);//等待EventForThread3Wait_1,EventForThread3Wait_2
  SetEvent(EventForThread_1_Wait);
  SetEvent(EventForThread_2_Wait);
end;

大概就是这样的逻辑
[解决办法]
又及
建立几个不发信号、手动重置的Event....


在WaitForMultipleObjects()后增加
//dosomething()
[解决办法]
如果线程1和线程2没结束,相应的handle是没信号的.
 WaitForMultipleObjects(2,Pointer(@handles[0]),True,INFINITE)这儿的handles数组是事件句柄吗?

EventForThread1Wait,EventForThread2Wait, EventForThread3Wait

handles[0]:=EventForThread1Wait;
handles[1]:=EventForThread2Wait;

开始时:
EventForThread1Wait 无信号 
EventForThread2Wait 无信号 
EventForThread3Wait 有信号


第一个线程
while not b_Z_Stop do
begin
  WaitForSingleObject(EventForThread3Wait,...);//等待可读取数据Event
  //读取数据
  SetEvEnt(EventForThread1Wait);
end;

第二个线程
while not b_Z_Stop do
begin
  WaitForSingleObject(EventForThread3Wait,...);//等待可读取数据Event
  //读取数据
  SetEvEnt(EventForThread2Wait);
end;

第三个线程
while not b_Z_Stop do
begin
  WaitForMultipleObjects(2,Pointer(@handles[0]),True,INFINITE);//等待
  SetEvent(EventForThread3Wait);
end;


[解决办法]
更正

引用:
又及
建立几个不发信号、手动重置的Event....


在WaitForMultipleObjects()后增加
//dosomething()


CreateEvent函数的参数bManualReset应该置为FALSE
[解决办法]
引用:
如果线程1和线程2没结束,相应的handle是没信号的.
 WaitForMultipleObjects(2,Pointer(@handles[0]),True,INFINITE)这儿的handles数组是事件句柄吗?

EventForThread1Wait,EventForThread2Wait, EventForThread3Wait

handles[0]:=EventForTh……


jankercsdn的逻辑有问题
   如果EventForThread3Wait自动复原,肯定引起死锁
   如果EventForThread3Wait手动复原,ResetEvent放在哪里呢?会不会引起死锁或者线程1或2多遍读取数据呢

[解决办法]
WaitForMultipleObjects(2,Pointer(@handles[0]),True,INFINITE);修改为
WaitForMultipleObjects(2,@handles,True,INFINITE);
试试

热点排行