如果sigwait()阻塞,何时接受的信号实际上是“选中”?

时间:2015-04-01 10:43:42

标签: c multithreading signals posix rtos

有两个实时线程。第一个具有低优先级,它正在等待sigwait()中的所有可能信号(因此所有信号都被阻塞,并且传递给该函数的sigmask已启用所有信号)。第二个具有高优先级并向第一个(低优先级)线程发送两个信号 - 它首先发送SIGRTMAX然后发送SIGRTMIN

sigwait()http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwait.html)的POSIX规范说明了这一点:

  

如果在通话时没有设置中的信号未决,则该线程将被暂停,直到一个或多个信号等待。

     

[...]

     

如果选择SIGRTMIN到SIGRTMAX范围内的多个待处理信号中的任何一个,则它应该是编号最小的信号。

实时操作系统中的事件序列如下所示:

(H)...............signal(SIGRTMAX)===signal(SIGRTMIN)===...
(L)===sigwait().........................................===
      ^           ^                  ^                  ^
      1           2                  3                  4
  • (H) - 高优先级线程
  • (L) - 低优先级线程
  • . - 线程未运行
  • = - 线程正在运行

4个有趣的观点:

  1. sigwait()上的低优先级线程块,当前没有信号待处理,所有信号都被阻止,高优先级线程尚未启动;
  2. 高优先级线程启动并向低优先级线程发送SIGRTMAX信号,该线程未被阻止但不允许运行,因为高优先级线程仍在运行;
  3. 高优先级线程继续运行并向低优先级线程发送SIGRTMIN信号,但低优先级线程仍在等待实际运行;
  4. 高优先级线程终止,允许低优先级线程运行并从sigwait()调用返回;
  5. 现在的问题是,如果SIGRTMINSIGRTMAX信号同时处于待处理状态,则SIGRTMIN应该被选中"第一。但是,我不确定信号实际上在哪个位置被选中" - 它是由内核在" 2"或者它可能是由低优先级线程中执行的sigwait()中的代码选择的,所以在" 4"?这就是为什么我不确定在上述情况中,sigwait()调用是否会实际选择SIGRTMINSIGRTMAX。也许这些细节是"实施定义"?

    这些问题与我正在开发的微控制器的实时操作系统(https://github.com/DISTORTEC/distortos)有关。目前我的代码"选择"生成过程中的信号,所以" 2" (我的代码首先会返回SIGRTMAX),但我不再确定这是正确的方法......

1 个答案:

答案 0 :(得分:2)

我认为这个场景描述了一场比赛。所以,结果是实现定义。

不应将信号用于同步。如果接收这两个信号的顺序很重要(对于应用程序),它应该采取适当的动作来同步(它们)。