【问题标题】:If sigwait() blocks, when is the accepted signal actually "selected"?如果 sigwait() 阻塞,则接受的信号实际上是什么时候“选择”的?
【发布时间】: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 点:

  1. sigwait() 上的低优先级线程阻塞,当前没有待处理的信号,所有信号都被阻塞,高优先级线程尚未启动;
  2. 高优先级线程启动并向低优先级线程发送SIGRTMAX信号,低优先级线程被解除阻塞,但不允许运行,因为高优先级线程仍在运行;
  3. 高优先级线程继续运行并向低优先级线程发送SIGRTMIN信号,但低优先级线程仍在等待实际运行;
  4. 高优先级线程终止,低优先级线程被允许运行并从sigwait()调用返回;

现在的问题是,如果SIGRTMINSIGRTMAX 信号同时处于未决状态,则应首先“选择”SIGRTMIN。但是我不确定信号实际上是在哪一点被“选择”的——它是由内核在“2”处选择的,还是由sigwait() 中的代码在低优先级线程中选择的,所以在“4”处?这就是为什么我不确定在上述场景中,sigwait() 调用是否会实际选择SIGRTMINSIGRTMAX。也许这样的细节是“实现定义的”?

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

【问题讨论】:

  • 不应该把这个“3.高优先级线程启动......”改为“3.高优先级线程继续运行...... “?否则这可能意味着 HP 线程停止运行。如果确实如此,那么事情就很清楚了。
  • @alk - 很好的收获(;很抱歉造成混乱

标签: c multithreading signals posix rtos


【解决方案1】:

我会考虑描述一场比赛的场景。所以,结果是实现定义的。

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

【讨论】:

  • 您对问题中描述的两个选项中的哪个更合适/预期/...有意见吗? (;
  • 不,因为我对/您的实施一无所知。一般来说,我会尝试以将缓冲减少到最低限度的方式进行编码,以便sigwait() 的实现在拉动时最有可能获得信号列表的最新内容来自列表的信号。@FreddieChopin
  • 另一方面,人们可能会争辩说相关的时间点是sigwait() 被调用的时间,因此实现可能只是去另一个等待错误并抓住最先到达的信号。 @FreddieChopin 正如我所说的“它的实现已定义”,并且您是实现者,请随心所欲... ;-)
  • 感谢您的意见!正如我在问题中所写,以前我会“选择”第 2 点中的信号,但现在我将其更改为第 4 点 - 不知何故感觉好一些......
  • 更正:“...转到另一个等待错误...”应改为:“...转到另一个方向... i>" ... :-}} @FreddieChopin
猜你喜欢
  • 2021-10-05
  • 1970-01-01
  • 2016-08-02
  • 2013-02-19
  • 1970-01-01
  • 2011-09-09
  • 2019-09-04
  • 2016-05-24
  • 2013-05-28
相关资源
最近更新 更多