当有sem_wait方法的等待信号量时,我在其他线程上调用sem_destroy方法。但是等待信号量并没有被唤醒。
在互斥的情况下,当有一些等待线程时,pthread_mutex_destroy返回值EBUSY。但是,sem_destroy返回0和errno也被设置为0。
我想在调用sem_destroy之后销毁信号量,以阻止已销毁的信号量访问,并唤醒等待的线程。
窗口操作系统的信号处理是可能的。请告诉我。谢谢。
发布于 2022-06-17 01:13:24
POSIX说sem_destroy
是这样的
销毁其他线程当前被阻塞的信号量的效果是未定义的。
它并没有特别地说其他线程被唤醒。事实上,如果sem_t
包含一个指向内存的指针,那么它所做的几乎肯定是释放内存,这意味着您随后会遇到一个使用后的安全问题。(情况是否如此取决于您的libc。)
为互斥和信号量分配的一般方法是,应该用它们的相关数据结构分配它们并释放它们,或者在相关代码需要它们之前分配它们,然后在使用它们完成整个代码之后释放它们。在C中,您无法安全地释放正在使用的数据结构(例如,使用sem_destroy
)。
如果要唤醒信号量的所有用户,则必须增加信号量,直到所有用户都醒来为止。您可以调用sem_getvalue
来确定是否有人在等待信号量,然后调用sem_post
来增加信号量。只有这样你才能安全地摧毁它。请注意,这可能有一个竞争条件,取决于您的代码。
但是,请注意,您必须注意,其他代码在信号量被销毁后不会继续使用它,例如尝试在循环中重新获取它。如果您仔细地正确地构造代码,那么您可以有信心这种情况不会发生。
https://stackoverflow.com/questions/72652911
复制相似问题