首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >它所说的‘释放信号量的线程不一定是获得它的线程’是什么意思?

它所说的‘释放信号量的线程不一定是获得它的线程’是什么意思?
EN

Stack Overflow用户
提问于 2016-10-28 13:25:15
回答 2查看 461关注 0票数 2

Semaphore vs. Monitors - what's the difference?中,

释放信号量的线程不一定是获得信号量的线程。

如果线程没有获得信号量,那么线程如何释放信号量?

这里的信号量是指在繁忙等待中实现的信号量,还是使用进程阻塞实现的信号量?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-10-28 13:45:08

信号量所涵盖的用例与互斥对象不同。

有了互斥物,你就对了。互斥通常用于防止代码中关键部分的并发执行。一个特定的线程将在关键部分开始时获取互斥对象,并在它再次离开关键部分时释放它。如果一个互斥对象被另一个线程释放,这将意味着关键部分跨越多个线程,这很可能不是您想要做的事情。

信号量的用例略有不同。它指示资源的可用性。需要使用资源的线程将获得信号量,该信号量在概念上是获取底层资源。如果没有可用的资源,则获取将阻止。

现在,在我们讨论一组固定资源(如一组可用的I/O端口)的场景中,获取线程再次释放资源也是有意义的。我获得了端口,做了一些工作,并在完成时释放了它,这样其他线程就可以在它上工作了。

但这并不是信号量的唯一用例。想想生产者/消费者:生产者线程可能提供资源(就像工作线程排队处理的项目一样),使用者线程会接受它们。在这些场景中,消耗的资源通常会消失,因此在获取资源后不会释放它们。相反,生成线程调用release以指示有可用的东西可供使用。然后,消费者调用获取来获取所产生的资源并对其进行处理。生产商永远不会呼叫收购,消费者也不会要求发布。

票数 2
EN

Stack Overflow用户

发布于 2016-10-28 13:28:39

在许多情况下,获得信号量的线程不能释放它,因为它被阻塞,等待某人释放信号量,而且必须是其他线程释放(信号)信号量。

在忙着等待的情况下实现信号量将是非常糟糕的。与锁不同的是,有些情况下信号保持很长时间(秒或分钟,小时可能有点不寻常,但绝对有可能)。

显然,对信号量对象的引用需要存储在另一个线程可以访问它的地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40306080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档