这个场景下怎么加锁?

2018-08-27 09:30:24 +08:00
 paparika

假设有 A,B,C 三个函数

1.A 执行时,不能并发 B 或者 C

2.B 或 C 执行时,不能并发 A

3.B,C 之间可以并发执行

这个场景锁应该怎么处理,C/C++

2966 次点击
所在节点    Linux
12 条回复
sagaxu
2018-08-27 09:35:38 +08:00
搞一个调度器,只锁调度器
paparika
2018-08-27 09:42:40 +08:00
@sagaxu 可以解释下吗
des
2018-08-27 09:43:16 +08:00
冲突的是资源,对资源加锁,函数持有资源
Monad
2018-08-27 09:47:53 +08:00
A 写锁 B/C 读锁
paparika
2018-08-27 09:55:07 +08:00
@Monad 好像是正解。读写互斥,读读不互斥对吧。另外如果我的场景是 A,B 两个函数,AB 间互斥,AA 互斥,BB 并发,也是用读写锁对吧
4357
2018-08-27 10:03:16 +08:00
读写锁正解。
还有一种办法,把 BC 封装到 D 中,D 和 A 互斥锁。
paparika
2018-08-27 10:12:39 +08:00
@4357 嗯,不过这样好像需要把 D 搞成异步任务的管理者
linyinma
2018-08-27 10:59:21 +08:00
创建两把锁:

A () {
lock(lck1);
lock(lck2);

//do something

lock(lck2);
lock(lck1);

}

B() {
lock(lck1);

//do something

lock(lck1);
}

C() {
lock(lck2);

//do something

lock(lck2);
}
linyinma
2018-08-27 11:00:12 +08:00
//do something 后是 unlock
paparika
2018-08-27 12:07:56 +08:00
@linyinma 嗯,也是一种思路
paparika
2018-08-27 12:59:42 +08:00
@linyinma 又考虑了下,这个方式实际上是有问题的,比如 A 拿到 L1 后被 C 先抢到 L2,那么 C 就没办法和 B 并发了
linyinma
2018-08-27 16:01:37 +08:00
注意 注意 “并发” 不等于 “并行” 不要偷换概念

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/483495

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX