Alarm()可以像这样在多线程中使用吗?

时间:2013-03-18 16:40:43

标签: c alarm

我很好奇我是否可以使用unistd c函数执行以下操作alarm(int signal)

创建我的主....并为每个线程帽创建用函数初始化SIGALRM,在激活的情况下应该关闭我的线程。这可能吗?或1 SIGALRM / main仅合法?

2 个答案:

答案 0 :(得分:2)

好的,首先,alarm()实际上是一个 unsigned int值,它是它到期前的秒数。因此,您的示例int signal不是alarm()的正确实现,仅仅是FYI。

就此而言:

for each thread that is created to initialization a SIGALRM
生成的SIGALRM是针对进程而不是每个线程完成的,所以你必须捕获警报并有一些内部策略来知道你为它提出了哪个线程并处理它因此。一旦有了处理程序,就可以一遍又一遍地发出警报,但请记住:

  

报警请求未堆叠;

所以你必须一次做这个。它仍然是可能的,但并不像你希望的那样完全向前发展。

对于我正在谈论的非常粗略的例子:

  • 你有一个跟踪请求的“经理”
  • 主题1告诉经理需要处理10s内的事情
  • 经理“记录”此内容并调用set alarm(10)
  • 线程2告诉经理需要在3秒内唤醒
  • 管理员调用alarm(0)来终止警报,调用alarm(3)然后注意到一旦关闭它需要调用alarm(7)来完成线程1的休眠时间
  • 在您的警报处理程序中,您只需致电经理并让其知道警报已关闭,它将唤醒相应的线程(2)然后重置下一个警报。

答案 1 :(得分:2)

  

进程中的每个线程都有一个独立的信号掩码   表示线程当前阻塞的信号集。一个   线程可以使用pthread_sigmask(3)操纵其信号掩码。在一个   传统的单线程应用程序,sigprocmask(2)可以用来   操纵信号掩码。

来自man 7的信号。

问题是警报每个进程都有效,而不是每个线程,所以如果线程的sigmask是相同的,你真的不知道哪一个会收到信号。