读书人

WaitForMultipleObjects死锁,该如何解

发布时间: 2013-01-08 14:02:14 作者: rapoo

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);
试试

读书人网 >.NET

热点推荐