哲学家就餐问题的一个解法

2023-02-17 20:45:42 +08:00
 movq

阻塞 lock 拿到一个筷子后,非阻塞 tryLock 另一个筷子。如果得不到,就把手里的筷子释放掉

这样感觉也可以解决

网上搜了下貌似没看到有人写这种解法?

2228 次点击
所在节点    程序员
28 条回复
Nerv
2023-02-17 23:58:01 +08:00
@movq 那我只能说以你这种学习方式不大可能真的取得什么进展。
lessMonologue
2023-02-18 00:08:53 +08:00
@movq
随手打了几个句号没想到你反应这么大。

你说我有莫名的优越感,我根本就不知道你所说的“莫名优越感”我在哪里体现出来了?难道是因为 #10 这句话吗?那我是在认真的告诉你那句话是我基于经验说的话,可能在你看来有些莫名其妙,但你还不配让我用我的知识来嘲讽你。

#12 楼的爆笑“逻辑判断”言论让人笑掉大牙。你不如去研究语言学?

最后,你先分清楚你在研究计算机科学还是在研究计算机工程学。
WuSiYu
2023-02-18 00:21:19 +08:00
单看你这种算法是可以工作的,但其实和一般讨论哲学家进餐问题时不是一个语境。

你这种算法算是一种自旋锁,假设一个哲学家 trylock 的那个筷子在较长时间内都有人在使用,那么期间它就会重复 [阻塞 lock 拿到一个筷子 - 非阻塞 tryLock 另一个筷子 - 得不到 - 释放掉] 的循环,会耗费很多 CPU 时间;

一般在 OS 课上我们讨论哲学家进餐问题时,只会允许算法使用信号量,也就是阻塞式的锁,在等待的时间中线程会切出去,不占用 CPU 时间。而自旋锁的实现并不在讨论的范围中。
movq
2023-02-18 08:15:43 +08:00
@lessMonologue 笑死人,已 block😁
ccagml
2023-02-18 09:40:28 +08:00
互斥条件、请求与保持条件 、不剥夺条件、循环等待条件,
如果先锁筷子 1 ,有了筷子 1 再锁筷子 2 ,这算是破坏循环等待条件吗?
yankebupt
2023-02-18 14:53:05 +08:00
樓主説錯了一個步驟,但我是知道他怎麽想的
鎖桌子,拿筷子 1 ,如果被筷子被鎖了,左邊人在吃飯,放棄,如果右邊筷子被鎖了,右邊人在吃飯,放棄,同時(桌子鎖内)拿起兩雙筷子,鎖筷子,解桌子。已經在吃的人不看桌子
更大粒度的沒性能鎖永遠解決問題(但這基本就是個排隊),但這個比更大粒度好一點點,因爲不影響已經在吃的人。
movq
2023-02-18 15:27:35 +08:00
@yankebupt

你说的这个是你自己想的吧。我的意思是第一个筷子先阻塞式锁,第二个筷子非阻塞锁。你的说法是第一个筷子也非阻塞锁。

不过感觉先锁桌子,然后左右 tryLock 也是可以的。
hxndg
2023-02-18 23:21:44 +08:00
没看明白上面在争吵什么,这个我印象中计算机教材应该讲过“哲学家就餐”,而且附录应该是有 lz 提到的解法
教材很多年前看的,不记得了。

不过 wiki 上应该有这种解法,一般来说是不会将这种确定性问题交给随机性来解决的

有一点可能要注意,死锁活锁是针对锁而言的,和通用概念的“死锁”可能不一致

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

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

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

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

© 2021 V2EX