【发布时间】:2015-04-01 10:43:42
【问题描述】:
有两个实时线程。第一个具有低优先级,它正在等待sigwait() 中的所有可能信号(因此所有信号都被阻止并且传递给函数的sigmask 已启用所有信号)。第二个具有高优先级并向第一个(低优先级)线程发送两个信号 - 它首先发送SIGRTMAX,然后发送SIGRTMIN。
sigwait() (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwait.html) 的 POSIX 规范是这样说的:
如果在调用时 set 中没有信号处于未决状态,则线程应暂停,直到有一个或多个信号处于未决状态。
[...]
如果选择 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),但我不再确定这是正确的方法......
【问题讨论】:
-
不应该把这个“3.高优先级线程启动......”改为“3.高优先级线程继续运行...... “?否则这可能意味着 HP 线程停止运行。如果确实如此,那么事情就很清楚了。
-
@alk - 很好的收获(;很抱歉造成混乱
标签: c multithreading signals posix rtos