由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - HELP:这个死锁是怎么发生的?
相关主题
请教一个线程同步的问题。VC++线程问题
重复利用threads的问题这样的deadlock如何debug?
java & signal processc++posix多线程问题请教
一个耗时函数如何响应外部事件?gdb catch signal
请教一个linux下面的多线程semaphore的问题。请问如何给sigalrm_handler传递参数
C signal SIGFPE 问题对pthread熟悉的XD请进来看看
关于在c++ member function里用signal( )java signal process
计算机供电不稳定会影响程序/线程运行吗?GCJ2009
相关话题的讨论汇总
话题: 死锁话题: 线程话题: signal话题: wait话题: while
进入Programming版参与讨论
1 (共1页)
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);

相关主题
C signal SIGFPE 问题VC++线程问题
关于在c++ member function里用signal( )这样的deadlock如何debug?
计算机供电不稳定会影响程序/线程运行吗?c++posix多线程问题请教
进入Programming版参与讨论
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 的大作中提到】
: 说的好。
: 问题就是这一位是
: 永远不可能
: 差出来的

1 (共1页)
进入Programming版参与讨论
相关主题
GCJ2009请教一个linux下面的多线程semaphore的问题。
c++之极弱问C signal SIGFPE 问题
关于signal handler关于在c++ member function里用signal( )
condional variable thread sync 问题 (转载)计算机供电不稳定会影响程序/线程运行吗?
请教一个线程同步的问题。VC++线程问题
重复利用threads的问题这样的deadlock如何debug?
java & signal processc++posix多线程问题请教
一个耗时函数如何响应外部事件?gdb catch signal
相关话题的讨论汇总
话题: 死锁话题: 线程话题: signal话题: wait话题: while