问题
假设您有两个互斥对象,guard_mtx_1和guard_mtx_2,它们在两个线程中保护对全局列表list_1的访问,这两个线程都运行以下代码段:
...
lock(guard_mtx_1);
Add(list_1, var_1);
Lock(guard_mtx_2);
Add(list_2, var_2);
Unlock(guard_mtx_1);
Unlock(guard_mtx_2);
...
会发生死锁吗?如果是这样的话,该如何避免呢?
我的不完整答案:
我看不出哪里会出现僵局。第一个线程锁定线路上的其他线程锁定:
锁定(guard_mtx_1)
然后在第行:
解锁(guard_mtx_1)
线程2可以到达第二行:
添加(list_1,var_1)
线程1可以在最后一行解锁互斥锁,线程2现在也可以到达最后一行并执行与线程1相同的操作。
或者我在这里错过了什么?
您不会错过任何东西。除非某些其他代码路径在锁定guard_mtx_1
之前锁定guard_mtx_2
,否则不存在死锁。无序解锁是无害的(偶尔我们也必须这样做)。
当两条代码路径可以按相反的顺序锁定互斥体(sp?应该是互斥体吗?我的拼写检查器不喜欢两者)时,就会发生死锁;也就是说,没有一个数字可以分配给每个互斥体,所有线程都以递增的数字顺序锁定互斥体。