roc*_*oll 6 c++ unix serial-port
我正在从多个串口读取数据.目前我正在使用自定义信号处理程序(通过设置sa_handler)来比较和唤醒基于文件描述符信息的线程.我正在寻找一种方法,让单个线程具有独特的信号处理程序,在这方面我发现将使用select系统调用.
现在我有以下问题:
如果你觉得这些问题很荒谬,请不要介意.我从未使用过这种串行通信机制.
该POSIX规范(选择)是去寻找的地方select定义.我个人建议poll- 它有一个更好的界面,可以处理任意数量的描述符,而不是系统定义的限制.
如果我理解正确,你会根据某些描述符的状态唤醒线程.更好的方法是让每个线程都有自己的描述符并调用select本身.你看,select不会修改系统状态,只要你使用线程局部变量,它就是安全的.但是,您肯定希望确保不关闭线程所依赖的描述符.
使用select/ pollwith a timeout会使"等待"直到内核端,这意味着线程通常会进入休眠状态.当线程处于休眠状态时,它不使用任何CPU时间.select另一方面,没有超时的呼叫中的while/for循环将为您提供更高的CPU使用率,因为您在循环中不断旋转.
希望这可以帮助.
编辑:此外,select/ 在多个线程中poll使用相同的描述符时,可能会有不可预知的结果.原因很简单,第一个线程可能被唤醒,因为描述符已准备好读取,但第二个线程必须等待下一个 "可供读取"唤醒.
只要你没有select在多个线程中使用相同的描述符,就不应该有问题.