我读从多个数据序列港口。现在我使用的定制信号处理程序(由设置sa_handler)进行比较,并唤醒线基础上的文件描述的信息。我在寻找一条出路有个线程具有独特的信号处理程序,在这方面,我发现,选择系统的电话是可以使用。

现在我有了以下问题:

  1. 如果我使用螺纹(脱),那么我在哪里把所选择的系统调监测串口?
  2. 是选择系统的电话线安全吗?
  3. 它是CPU密集型的,因为有许多事情发生在我的应用程序,包括GUI更新?

请不要介意,如果你找到这些问题是荒谬的。我从来没有使用这样一种机制,用于串行通信。

有帮助吗?

解决方案

POSIX规范(选择) 是的地方去寻找 select 定义。我个人建议 poll -它有一个更好的界面和能够处理任何数量的描述,而不是一系统定义的限制。

如果我理解正确的话你醒来的线基于国家的某些描述符。一个更好的办法就是每个线程有它自己的描述符并呼选择本身。你看,选择不修改该系统的状态,并且只要使用螺纹地方的变量,这将是安全的。但是,你肯定会想要确保你不要关闭一个描述这一个线程取决。

使用 select/poll 有一个超时离开"等待"的内核侧,这指纹是通常把睡觉。虽然螺纹睡觉这不是使用任何CPU时间。一段时间/环路上 select 电话没有超时在另一方面会给你一个更高的占用你们不断地旋转在环。

希望这会有所帮助。

编辑:此外, select/poll 可以有不可预料的结果时,工作 描述在多线程。原因很简单,因为这是第一线可能被唤醒,因为该描述是准备用于阅读,但第二线有等待 "可用于阅读"唤醒。

只要你没有 select荷兰在同一描述符多线你不应该有一个问题。

其他提示

这是一个呼叫系统--它应线的安全,我想。

我没有这样做之前,但是我将不感到惊讶,如果它在那里没有。如何密集的CPU select() 是,在我看来在很大程度上的数量的文件处理你是在等待。 select() 大多是使用,要等待数(>1)的文件处理成为准备。

还应该提到的是 select() 不应利用调查的文件处理--对于业绩原因。正常使用情况是:你有你的工作和某些时间可以等待,直到下一件事情是怎么回事。现在你停止你的工艺选择和让另一个进程的运行。 select() 通常不会暂停活动过程。这是如何一起工作线,我不知道!我认为,整个过程中(以及所有的线)被暂停。但是,这可能会被记录在案。它还可能取决于(Linux)是否使用系统的线或用户线。核不会知道的用户线程,因此中止整个过程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top