首页 > 解决方案 > 操作系统互斥体

问题描述

问题

假设您有两个互斥锁,guard_mtx_1guard_mtx_2 ,它们在运行以下代码片段的两个线程中保护对全局列表list_1list_2的访问:

...
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 相同的操作。

或者我在这里遗漏了什么?

标签: coperating-systemsystems-programming

解决方案


你什么都错过了。除非其他代码路径在锁定guard_mtx_2之前锁定guard_mtx_1,否则不会出现死锁。乱序解锁是无害的(有时我们必须这样做)。

当两个代码路径可以以相反的顺序锁定互斥锁(sp?它应该是互斥锁吗?我的拼写检查器都不喜欢)时,就会发生死锁;也就是说,没有可以为每个互斥锁分配的数字,所有线程以递增的数字顺序锁定互斥锁。


推荐阅读