c - 操作系统互斥体
问题描述
问题
假设您有两个互斥锁,guard_mtx_1和guard_mtx_2 ,它们在运行以下代码片段的两个线程中保护对全局列表list_1和list_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 相同的操作。
或者我在这里遗漏了什么?
解决方案
你什么都错过了。除非其他代码路径在锁定guard_mtx_2
之前锁定guard_mtx_1
,否则不会出现死锁。乱序解锁是无害的(有时我们必须这样做)。
当两个代码路径可以以相反的顺序锁定互斥锁(sp?它应该是互斥锁吗?我的拼写检查器都不喜欢)时,就会发生死锁;也就是说,没有可以为每个互斥锁分配的数字,所有线程以递增的数字顺序锁定互斥锁。
推荐阅读
- python - PySide中QIcon上的Painter Shape
- ios - 使用 JSON 格式从网站获取数据
- javascript - Spotify 授权码授予:错误请求
- ruby - Ruby:类定义中的 self 关键字
- docker - 如何“docker push”到动态不安全的注册表?
- facebook - Facebook 隐私政策无效,因为我们支持 https
- azure-cognitive-search - Azure 搜索中的同义词映射、同义词短语
- r - 如何删除附加到数字的斜线
- asp.net-core - dotnet restore 和 clear 不修复 vscode 中的依赖问题
- javascript - 在异步函数中使用 setTimeout