在线程中选择()系统调用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在线程中选择()系统调用?相关的知识,希望对你有一定的参考价值。
我正在从多个串口读取数据。目前我正在使用自定义信号处理程序(通过设置sa_handler)来比较和唤醒基于文件描述符信息的线程。我正在寻找一种方法,让单个线程具有独特的信号处理程序,在这方面我发现将使用select系统调用。
现在我有以下问题:
- 如果我使用线程(Qt),那么我在哪里进行select系统调用来监控串口?
- select系统调用线程是否安全?
- 它是CPU密集型的,因为我的应用程序中发生了很多事情,包括GUI更新?
如果你觉得这些问题很荒谬,请不要介意。我从未使用过这种串行通信机制。
POSIX specification (select)是寻找select
定义的地方。我个人推荐poll
- 它有一个更好的界面,可以处理任意数量的描述符,而不是系统定义的限制。
如果我理解正确,你会根据某些描述符的状态唤醒线程。更好的方法是让每个线程都有自己的描述符并调用select本身。你看,select不会修改系统状态,只要你使用线程局部变量,它就是安全的。但是,您肯定希望确保不关闭线程所依赖的描述符。
使用带有超时的select
/ poll
会使“等待”直到内核端,这意味着线程通常会进入休眠状态。当线程处于休眠状态时,它不使用任何CPU时间。另一方面,没有超时的select
调用上的while / for循环将为您提供更高的CPU使用率,因为您在循环中不断旋转。
希望这可以帮助。
编辑:另外,当在多个线程中使用相同的描述符时,select
/ poll
可能会产生不可预测的结果。原因很简单,第一个线程可能被唤醒,因为描述符已准备好读取,但第二个线程必须等待下一个“可供读取”唤醒。
只要你不是在多个线程中对同一个描述符进行select
ing就不应该有问题。
这是一个系统调用 - 我认为它应该是线程安全的。
我之前没有这样做,但如果没有,我会感到很惊讶。 CPU密集型select()
的用途,在很大程度上取决于您正在等待的文件句柄数量。 select()
主要用于等待一个(> 1)个文件句柄准备就绪。
还应该提到的是,select()
不应该用于轮询文件句柄 - 出于性能原因。正常使用方法是:你完成了你的工作,并且可以经过一段时间直到接下来的事情发生。现在,您使用select暂停进程并让另一个进程运行。 select()
通常会暂停活动进程。如何与线程一起工作,我不确定!我认为,整个过程(和所有线程)都被暂停。但这可能会记录在案。它也可能(在Linux上)依赖于系统线程还是用户线程。内核不会知道用户线程,因此暂停整个过程。
以上是关于在线程中选择()系统调用?的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段