信号量可以只用锁来制作吗?

发布于 2024-12-04 04:23:04 字数 487 浏览 0 评论 0原文

我想知道是否可以仅使用锁来构建信号量。我见过使用中断禁用/启用以及使用原子原语(如测试和设置)的实现,但是是否可以仅使用锁来实现?

似乎做类似的事情

guard = 0;
...
while(test&set(guard));

基本上与做 lock.acquire() 相同。我在这里错过了什么吗?

编辑:我问这个问题的部分原因是因为我在这里阅读这些幻灯片:http://www.cs.washington.edu/homes/arvind/cs422/lectureNotes/l7-6.pdf 这些幻灯片提供了以下实现使用中断禁用和测试和设置的信号量,但提出了使用锁的信号量的实现作为一个问题,我认为这意味着使用锁的实现可能由于某种原因而不起作用。

I was wondering if a semaphore can be built using just locks. I've seen implementations with interrupt disable/enable and using atomic primitives like test&set, but is it possible to implement one using locks only?

It seems like doing something like

guard = 0;
...
while(test&set(guard));

is basically the same as doing a lock.acquire(). Am I missing anything here?

Edit: Part of the reason I'm asking this question is because I was reading these slides here: http://www.cs.washington.edu/homes/arvind/cs422/lectureNotes/l7-6.pdf These slides offer implementations of semaphores using interrupt disable and test&set, but poses the implementation of semaphores using locks as a question, which I took to imply that an implementation using locks might not work for some reason.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋叶绚丽 2024-12-11 04:23:04

我认为问题在于你在那个循环中忙着等待。您所说的 acquire() 是一个进入睡眠状态的操作,只有在获取信号量后才会被唤醒。

I think the problem is that you're busy-waiting in that loop. What you call acquire() would be an operation that goes to sleep and is only woken up once the the semaphore has been acquired.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文