gpt4 book ai didi

c - 如果 sigwait() 阻塞,什么时候接受的信号实际上是 "selected"?

转载 作者:太空宇宙 更新时间:2023-11-04 02:43:46 26 4
gpt4 key购买 nike

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

sigwait() ( http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwait.html ) 的 POSIX 规范是这样说的:

If no signal in set is pending at the time of the call, the thread shall be suspended until one or more becomes pending.

[...]

Should any of the multiple pending signals in the range SIGRTMIN to SIGRTMAX be selected, it shall be the lowest numbered one.

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

(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() 调用实际上会选择 SIGRTMIN 还是 SIGRTMAX。也许这样的细节是“实现定义的”?

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

最佳答案

我认为场景描述的是一场比赛。所以,好吧,结果是实现定义的。

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

关于c - 如果 sigwait() 阻塞,什么时候接受的信号实际上是 "selected"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29388749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com