d******i 发帖数: 7160 | 1 两个线程A/B,两个自动事件a/b.
线程A:
while(1)
{
b.setevent;
...
waitfor(a);
}
线程B:
while(1)
{
waitfor(b);
...
a.setevent;
}
有时发现死锁在两个wait上。
可就是想不明白为什么。
请指教。
谢谢! |
b********n 发帖数: 609 | 2 http://www.drdobbs.com/cpp/209900973
【在 d******i 的大作中提到】 : 两个线程A/B,两个自动事件a/b. : 线程A: : while(1) : { : b.setevent; : ... : waitfor(a); : } : 线程B: : while(1)
|
d******i 发帖数: 7160 | 3
A和B的Wait/SetEvent的顺序是不同的,和给的例子不一样啊。
【在 b********n 的大作中提到】 : http://www.drdobbs.com/cpp/209900973
|
b********n 发帖数: 609 | 4 那个a和b的event是怎么发的,确定两个thread总能接到event么?有一个接不到就僵在
那里了。
【在 d******i 的大作中提到】 : : A和B的Wait/SetEvent的顺序是不同的,和给的例子不一样啊。
|
d******i 发帖数: 7160 | 5 就是 setevent 成Signaled 状态啊。
按说A被Block在Wait(b)时定然已经Signal(a)了,那么为什么B还会被Block在Wait(a)
上呢?
不懂啊。
【在 b********n 的大作中提到】 : 那个a和b的event是怎么发的,确定两个thread总能接到event么?有一个接不到就僵在 : 那里了。
|
b********n 发帖数: 609 | 6 你的code不全没法判断,比如a,b有没有被lock。
【在 d******i 的大作中提到】 : 就是 setevent 成Signaled 状态啊。 : 按说A被Block在Wait(b)时定然已经Signal(a)了,那么为什么B还会被Block在Wait(a) : 上呢? : 不懂啊。
|
d****p 发帖数: 685 | 7 optimization is on?
Sometime statements swapped in generated code.
【在 d******i 的大作中提到】 : 两个线程A/B,两个自动事件a/b. : 线程A: : while(1) : { : b.setevent; : ... : waitfor(a); : } : 线程B: : while(1)
|
b********n 发帖数: 609 | 8 没听说过optimization能产生deadlock。
【在 d****p 的大作中提到】 : optimization is on? : Sometime statements swapped in generated code.
|
d******i 发帖数: 7160 | 9 FT,还要怎么全啊。
CEvent a(0,0),b(0,0) //booth automatic and initially unsignalled
void A()
{
b.SetEvent();
WaitForSingleObject(a);
}
void B()
{
WaitForSingleObject(b);
a.SetEvent();
}
整成Worker线程就不用写了吧。
咋就死锁了呢?
【在 b********n 的大作中提到】 : 你的code不全没法判断,比如a,b有没有被lock。
|
b********n 发帖数: 609 | 10 http://stackoverflow.com/questions/964719/waitforsingleobject
是不是这问题?
【在 d******i 的大作中提到】 : FT,还要怎么全啊。 : CEvent a(0,0),b(0,0) //booth automatic and initially unsignalled : void A() : { : b.SetEvent(); : WaitForSingleObject(a); : } : void B() : { : WaitForSingleObject(b);
|
|
|
d******i 发帖数: 7160 | 11 可能是Signal了以后没有线程在WFSO的问题。
有两种说法莫终于是:
一种说如果没人在等就白Signal了,
另一种说没问题。
各位以为如何?
【在 b********n 的大作中提到】 : http://stackoverflow.com/questions/964719/waitforsingleobject : 是不是这问题?
|
b********n 发帖数: 609 | 12 我不搞Windows编程,反正Linux下如果signal了没有thread在等,肯定是白费了,
Windows应该也是一样。
【在 d******i 的大作中提到】 : 可能是Signal了以后没有线程在WFSO的问题。 : 有两种说法莫终于是: : 一种说如果没人在等就白Signal了, : 另一种说没问题。 : 各位以为如何?
|
d******i 发帖数: 7160 | 13 不是吧。
只知道palseEvent会自动reset(不管有没有谁在等),没听说SetEvent也会啊。
可是侯捷翻的那本多线程的书是这么说的。
不懂了。
【在 b********n 的大作中提到】 : 我不搞Windows编程,反正Linux下如果signal了没有thread在等,肯定是白费了, : Windows应该也是一样。
|
b********n 发帖数: 609 | 14 我说过我不搞Windows,你attach debugger看一下不就完了。
【在 d******i 的大作中提到】 : 不是吧。 : 只知道palseEvent会自动reset(不管有没有谁在等),没听说SetEvent也会啊。 : 可是侯捷翻的那本多线程的书是这么说的。 : 不懂了。
|
P********e 发帖数: 2610 | 15 我没看出来为什么会死锁啊
我们就程序就有这么写的呢
你确定就2个event?
可能是Signal了以后没有线程在WFSO的问题。
有两种说法莫终于是:
一种说如果没人在等就白Signal了,
另一种说没问题。
各位以为如何?
【在 d******i 的大作中提到】 : 可能是Signal了以后没有线程在WFSO的问题。 : 有两种说法莫终于是: : 一种说如果没人在等就白Signal了, : 另一种说没问题。 : 各位以为如何?
|
b*******s 发帖数: 5216 | 16
没错,POSIX threading就是这样的,没人在等的话signal也白费了
解决之一就是wait不要傻等,给个timeout
或者想办法保证signal之前一定wait
【在 b********n 的大作中提到】 : 我不搞Windows编程,反正Linux下如果signal了没有thread在等,肯定是白费了, : Windows应该也是一样。
|
a****l 发帖数: 8211 | 17 您给的例子不是在一个while的loop里吗?既然是while,循环不就一样了吗?
while (1) {A;B}的执行是 A,B,A,B,A,B
差一位不就是B,A,B,A,B,A,
就等于 while (1) {B,A}吗?
其实问题就是差了一位.
【在 d******i 的大作中提到】 : 不是吧。 : 只知道palseEvent会自动reset(不管有没有谁在等),没听说SetEvent也会啊。 : 可是侯捷翻的那本多线程的书是这么说的。 : 不懂了。
|
d******i 发帖数: 7160 | 18 说的好。
问题就是这一位是
永远不可能
差出来的 |
e****d 发帖数: 895 | 19 CPU & compiler optimization could reorder them, but not in this case though.
【在 d******i 的大作中提到】 : 说的好。 : 问题就是这一位是 : 永远不可能 : 差出来的
|
a****l 发帖数: 8211 | 20 其实楼上不已经解释过为什么是可能差出这一位的了吗?你自己仔细想想,为什么系统的
设计会导致能差这一位还是很有道理的.
【在 d******i 的大作中提到】 : 说的好。 : 问题就是这一位是 : 永远不可能 : 差出来的
|