在线程中选择()系统调用?

roc*_*oll 6 c++ unix serial-port

我正在从多个串口读取数据.目前我正在使用自定义信号处理程序(通过设置sa_handler)来比较和唤醒基于文件描述符信息的线程.我正在寻找一种方法,让单个线程具有独特的信号处理程序,在这方面我发现将使用select系统调用.

现在我有以下问题:

  1. 如果我使用线程(Qt),那么我在哪里进行select系统调用来监控串口?
  2. select系统调用线程是否安全?
  3. 它是CPU密集型的,因为我的应用程序中发生了很多事情,包括GUI更新?

如果你觉得这些问题很荒谬,请不要介意.我从未使用过这种串行通信机制.

Mat*_*lin 7

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

如果我理解正确,你会根据某些描述符的状态唤醒线程.更好的方法是让每个线程都有自己的描述符并调用select本身.你看,select不会修改系统状态,只要你使用线程局部变量,它就是安全的.但是,您肯定希望确保不关闭线程所依赖的描述符.

使用select/ pollwith a timeout会使"等待"直到内核端,这意味着线程通常会进入休眠状态.当线程处于休眠状态时,它不使用任何CPU时间.select另一方面,没有超时的呼叫中的while/for循环将为您提供更高的CPU使用率,因为您在循环中不断旋转.

希望这可以帮助.

编辑:此外,select/ 在多个线程中poll使用相同的描述符时,可能会有不可预知的结果.原因很简单,第一个线程可能被唤醒,因为描述符已准备好读取,但第二个线程必须等待下一个 "可供读取"唤醒.

只要你没有select在多个线程中使用相同的描述符,就不应该有问题.