【发布时间】:2012-04-15 06:04:35
【问题描述】:
我正在处理 pthread 多线程代码,每个线程都在文件描述符上调用 read()。 read() 是一个阻塞调用,因此它等待数据。但我希望它只等待 3 秒来等待数据。
我曾想过使用alarm() 和hadling SIGALRM,但如果我在一个线程中发出警报,所有线程都会收到该SIGALRM 信号,并且所有线程都将放弃读取。我该怎么做?
【问题讨论】:
我正在处理 pthread 多线程代码,每个线程都在文件描述符上调用 read()。 read() 是一个阻塞调用,因此它等待数据。但我希望它只等待 3 秒来等待数据。
我曾想过使用alarm() 和hadling SIGALRM,但如果我在一个线程中发出警报,所有线程都会收到该SIGALRM 信号,并且所有线程都将放弃读取。我该怎么做?
【问题讨论】:
为此使用select 呼叫。它有一个参数允许您指定超时。
select 的 Linux 手册页有一个示例用法,您可以在此处和网络上的其他地方找到很多示例。
如果您不担心便携性,还有更多现代/功能丰富的选项。
epoll 工具。手册页有示例代码,this question 列出了一些带有其他使用信息的博客。 kqueue。 您可能希望研究库以将所有内容抽象出来。 libevent 值得一看,它封装了上述大部分操作系统特定的接口。
【讨论】:
epoll 不可移植,select 不会很快消失。当然还有更现代的替代品,但它们也(IMO)通常更难正确。