有两个实时线程。第一个具有低优先级,它正在等待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个有趣的观点:
sigwait()
上的低优先级线程块,当前没有信号待处理,所有信号都被阻止,高优先级线程尚未启动; SIGRTMAX
信号,该线程未被阻止但不允许运行,因为高优先级线程仍在运行; SIGRTMIN
信号,但低优先级线程仍在等待实际运行; sigwait()
调用返回; 现在的问题是,如果SIGRTMIN
和SIGRTMAX
信号同时处于待处理状态,则SIGRTMIN
应该被选中"第一。但是,我不确定信号实际上在哪个位置被选中" - 它是由内核在" 2"或者它可能是由低优先级线程中执行的sigwait()
中的代码选择的,所以在" 4"?这就是为什么我不确定在上述情况中,sigwait()
调用是否会实际选择SIGRTMIN
或SIGRTMAX
。也许这些细节是"实施定义"?
这些问题与我正在开发的微控制器的实时操作系统(https://github.com/DISTORTEC/distortos)有关。目前我的代码"选择"生成过程中的信号,所以" 2" (我的代码首先会返回SIGRTMAX
),但我不再确定这是正确的方法......
答案 0 :(得分:2)
我认为这个场景描述了一场比赛。所以,结果是实现定义。
不应将信号用于同步。如果接收这两个信号的顺序很重要(对于应用程序),它应该采取适当的动作来同步(它们)。