我有一个从文件描述符读取数据的线程,select()
用于阻塞直到数据可用。当程序需要终止时,我需要关闭线程,但是它在选择时被阻塞。
我的问题是,通过关闭文件描述符来通知线程我打算终止的意图是一个好习惯吗?
有没有更好的方法来通知线程?我知道总是可以选择使用信号,但是我在某些地方读到信号pthreads
不能很好地协同工作。
我有一个从文件描述符读取数据的线程,select()
用于阻塞直到数据可用。当程序需要终止时,我需要关闭线程,但是它在选择时被阻塞。
我的问题是,通过关闭文件描述符来通知线程我打算终止的意图是一个好习惯吗?
有没有更好的方法来通知线程?我知道总是可以选择使用信号,但是我在某些地方读到信号pthreads
不能很好地协同工作。
好吧,您可以使用管道,并将其添加到您的读取集中。当线程应该终止时,在管道上发送一个字节。
或者select
通话超时,超时时检查终止标志。
除了Joachim提出的温和方式之外,还有一些粗略的方法可以“中断”阻塞select()
:
pthread_kill()
向阻塞线程发送信号并在有问题(EINTR == errno)
之后进行测试select()
pthread_cancel()
线程 ID。select()
属于默认取消点的集合。这两种方法都应被视为最后的解决方案。