[技术方案讨论] 如何仅使用 set、get 操作实现一个锁?

2023-08-11 11:58:17 +08:00
 CC11001100

比如现在我们有一个服务,这个服务提供了两种操作:

op 想了几天了也没想清楚到底咋搞,目前隐约有的几种思路:

网上找到了几个类似的解决方案,但模拟演算了半天总感觉是有问题的:
localStorage 互斥锁的使用
fast-mutex

op 之前在论坛里发过几次帖子,难的 op 想跳河的问题大佬们都是随手点拨困难烟消云散,所以就寻思着来论坛里问问,看看大佬们有啥看法

BTW: 非公司业务非盈利相关,只是笔者自己学习折腾时的一些奇奇怪怪的想法拿出来和大家讨论一下

2423 次点击
所在节点    程序员
25 条回复
yinfeng
2023-08-11 15:27:24 +08:00
这是非常经典的计科问题,使用任意多个,有读和写方法的,顺序一致的,原子寄存器实现互斥锁。

简单看了下 fast-mutex 用的算法,它试图用两个 SC 的原子寄存器去实现 n 个线程的互斥,假设了一个线程的延迟执行一定能使其他线程执行完 lock 的代码。问题就是如果无视这个假设很容易就能构造反例。

如果非要去做这样的事,有挺多算法可以选择,只是都很慢。最经典的就是,两线程可以用 Peterson lock ,Peterson lock 可以推广到 n 个线程叫作 filter lock ,还有具有公平性的 bakery 算法。
https://en.wikipedia.org/wiki/Peterson%27s_algorithm
https://en.wikipedia.org/wiki/Lamport%27s_bakery_algorithm
Mistwave
2023-08-11 15:32:25 +08:00
@Kumo31 确实是这样,老哥 tql
第七页:
https://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf
ysc3839
2023-08-11 15:38:35 +08:00
@chesha1 exchange 实际上不会有 compare 操作,就只是交换值。只有多状态的锁(比如读写锁)才需要 compare exchange 操作。
chesha1
2023-08-11 15:57:33 +08:00
@ysc3839 还真是,我又仔细看了一眼,是我自己想错了
spin 条件判断调用了一个通用的 boost::atomic 的 exchange 方法,肯定跟模板参数的属性没关系
nuk
2023-08-28 03:55:59 +08:00
老哥可以看看这本书《多处理器编程的艺术》

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

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

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

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

© 2021 V2EX