c-操作系统互斥



问题

假设您有两个互斥对象,guard_mtx_1guard_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?应该是互斥体吗?我的拼写检查器不喜欢两者)时,就会发生死锁;也就是说,没有一个数字可以分配给每个互斥体,所有线程都以递增的数字顺序锁定互斥体。

相关内容

  • 没有找到相关文章

最新更新