首页
社区
课程
招聘
为什么多线程导致死锁?
发表于: 2014-8-27 12:44 4784

为什么多线程导致死锁?

2014-8-27 12:44
4784
{
HANDLE h[2];
h[0] = hAutoResetEvent1;  //event 是自动的,初始信号为未触发
h[1] = hAutoResetEvent1;  //event 是自动的,初始信号为未触发

waitformutipleobjects(2, h, true, infinite);
}

假设waitformutipleobjects 不是原子操作,

请问在多线程的什么情况下,这代码会导致死锁呢?
提示: waitfor系列函数 会对 自动事件修改状态,如 发现某个事件是触发,会修改为未触发。

可以举例说明吗?

比如,线程1 ,线程2 ,如何到第几步的操作的时候,才会出现死锁。

我想了很久,找不到 “什么情况下会出现死锁“?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 335
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
常见死锁有两种:
1) 假设两个线程 A、B,分别有两个锁 1、2
    A  锁 1
    B 锁 2
    A 锁 2
    B 锁 1
   这时会死锁,这种情况叫互锁。

2) 还有一种就是在还没有 Unlock 时又企图去 Lock 一个锁。

你所说的 WaitForxxxObject 函数死锁,是因为它等待的信号没有发生造成。
检查你的信号句柄是否已经设置。
2014-8-27 13:39
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=seu人;1312294]{
HANDLE h[2];
h[0] = hAutoResetEvent1;  //event 是自动的,初始信号为未触发
h[1] = hAutoResetEvent1;  //event 是自动的,初始信号为未触发

waitformutipleobjects(2, h, true,...[/QUOTE]

死锁的原因是:

线程1的等待函数发现 event1  有信号,event2没有信号。

所以不会对event1对象产生任何的副作用。

接下来,event2有信号后,系统会让2个事件 都设为未触发的。

让一个线程执行。另一个线程,会继续等待。

这就防止死锁了。

如果waitformutiple不是原子操作。

比如线程1 对事件1 产生副作用后,事件1就会未触发。
线程2 对事件产生副作用后,事件2就会为触发

线程1等待 事件2

线程2 等待 事件1

造成死锁。

当然这一切,都是黑盒猜测,waitformutiple的源码没有看到。

2014-8-30 14:29
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
三角债知道吧,互相欠钱,死循环
2017-5-30 19:41
0
游客
登录 | 注册 方可回帖
返回
//