【问题标题】:sem_wait interrupt signal on FreeBSDFreeBSD 上的 sem_wait 中断信号
【发布时间】:2013-01-11 23:57:53
【问题描述】:

我注意到在我的 FreeBSD9 副本中,来自 sempahore.h 的 sem_wait 的手册页没有 EINTR 错误返回值。我目前有一些具有信号处理程序的代码,并且我正在提出一个 SIGINT 信号。这似乎没有唤醒我的 sem_wait() 所以我可以检查返回值,因此运行 sem_wait 函数的线程会无限期挂起。

根据 linux 手册页,我应该能够提高信号,测试执行 sem_wait 的线程中的 EINTR 值,但在 FreeBSD 中似乎缺少。

解决这个问题的正确方法是什么?

这就是我所拥有的伪

signal_handler() //handles SIGINT
{
loopvar = 0;
}

线程 1:

while(loopvar)
{

    if((r = sem_wait())
    {
    check error value
     continue
    }

    ..
    sem_post()
}

线程 2:

raise(SIGINT);

所以我期待当 thread2 引发 SIGINT 时,它会导致 sem_wait 返回一个值,循环将继续,但现在 loopvar 将为零,所以我将退出我的无限循环。

编辑:要清楚,我没有使用 SA_RESTART 标志。

【问题讨论】:

    标签: c semaphore freebsd


    【解决方案1】:

    raise 为调用线程而不是进程引发信号。如果你想给整个过程发信号(传递给一个没有屏蔽信号的随机线程),你需要kill函数。如果你想给特定线程发信号,你需要pthread_kill

    【讨论】:

    • 附带说明,pthread_kill 实际上并没有杀死线程,它只是一个不幸命名的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多