首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >linux未命名posix信号量sem_destroy,sem_wait方法问题

linux未命名posix信号量sem_destroy,sem_wait方法问题
EN

Stack Overflow用户
提问于 2022-06-16 23:35:41
回答 1查看 32关注 0票数 1

当有sem_wait方法的等待信号量时,我在其他线程上调用sem_destroy方法。但是等待信号量并没有被唤醒。

在互斥的情况下,当有一些等待线程时,pthread_mutex_destroy返回值EBUSY。但是,sem_destroy返回0和errno也被设置为0。

我想在调用sem_destroy之后销毁信号量,以阻止已销毁的信号量访问,并唤醒等待的线程。

窗口操作系统的信号处理是可能的。请告诉我。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-17 01:13:24

POSIX说sem_destroy是这样的

销毁其他线程当前被阻塞的信号量的效果是未定义的。

它并没有特别地说其他线程被唤醒。事实上,如果sem_t包含一个指向内存的指针,那么它所做的几乎肯定是释放内存,这意味着您随后会遇到一个使用后的安全问题。(情况是否如此取决于您的libc。)

为互斥和信号量分配的一般方法是,应该用它们的相关数据结构分配它们并释放它们,或者在相关代码需要它们之前分配它们,然后在使用它们完成整个代码之后释放它们。在C中,您无法安全地释放正在使用的数据结构(例如,使用sem_destroy)。

如果要唤醒信号量的所有用户,则必须增加信号量,直到所有用户都醒来为止。您可以调用sem_getvalue来确定是否有人在等待信号量,然后调用sem_post来增加信号量。只有这样你才能安全地摧毁它。请注意,这可能有一个竞争条件,取决于您的代码。

但是,请注意,您必须注意,其他代码在信号量被销毁后不会继续使用它,例如尝试在循环中重新获取它。如果您仔细地正确地构造代码,那么您可以有信心这种情况不会发生。

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

https://stackoverflow.com/questions/72652911

复制
相关文章

相似问题

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