0

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

拥有我的 main.... 并为每个线程创建帽子以使用该函数初始化一个 SIGALRM,该函数应在激活时关闭我的线程。这可能吗?还是 1 SIGALRM / main 仅合法?

4

2 回答 2

2

好的,首先,alarm()它实际上是一个无符号整数值,它是它到期前的秒数。所以你的例子int signal不是正确的实现alarm(),仅供参考。

就这一点而言:

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

报警请求不堆叠;

所以你必须一次做这个。这仍然是可能的,但并不像您希望的那样完全直截了当。

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

  • 你有一个跟踪请求的“经理”
  • 线程 1 告诉经理它需要在 10 秒内处理一些事情
  • 经理“记录”这个并调用 setalarm(10)
  • 线程 2 告诉管理器它需要在 3 秒内被唤醒
  • 经理打电话alarm(0)来终止警报,然后打电话alarm(3)并注意到一旦响起,它需要调用alarm(7)以完成线程 1 的睡眠时间
  • 在您的警报处理程序中,您只需致电经理并让它知道警报响起,它将唤醒适当的线程(2)然后为下一个重置警报。
于 2013-03-18T16:58:57.690 回答
2

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

来自 man 7 的信号。

问题是警报每个进程而不是每个线程都有效,因此如果线程的 sigmask 相同,则您无法真正知道哪个会收到信号。

于 2013-03-18T17:11:43.043 回答