3

我在 vxworks 手册中遇到以下内容,想知道为什么会这样。

信号做了哪些类型的事情使它们不受欢迎?

在应用程序中,信号最适合错误和异常处理,而不是通用的任务间通信。

4

1 回答 1

3

信号的主要问题是信号处理程序是在每个进程/内存空间的基础上注册的(在 vxWorks 中,内核代表一个内存空间,每个 RTP 是不同的内存空间)。

这意味着无论线程/任务上下文如何,都会执行相同的信号处理程序(对于给定进程)。如果您的信号处理程序表现不佳,这可能会导致一些副作用问题。

例如,如果您的信号使用互斥锁来保护共享资源,这可能会导致令人讨厌的问题,或者至少会导致意外行为

  任务 A 任务 B 信号处理程序
  采取互斥体
   ...
   被抢占
                                做某事
                                 ……
                                <SIGNAL ARRIVES>----->取 Mutex(块)
   简历
   ……
   给互斥体
                                                ----->简历处理程序

我不确定上面的例子是否真的传达了我想要表达的意思。以下是信号的一些其他特征:

  • 处理程序在任务/进程被安排之前不会执行。仅仅因为您发送了信号,并不意味着处理程序会立即执行
  • 不保证哪个任务/线程将执行处理程序。进程中的任何线程/任务都可以运行它(无论哪个线程/任务先执行)。VxWorks 有办法解决这个问题。

请注意,上述内容仅适用于通过 kill 调用发送的异步信号。

异常将生成一个同步信号,该信号将在当前上下文中立即执行。

于 2011-05-09T11:03:05.210 回答