0

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

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

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

在psuedo这就是我所拥有的

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 标志。

4

1 回答 1

1

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

于 2013-01-12T03:42:47.830 回答