我有一个线程从文件描述符中读取数据,使用select()
阻塞直到数据可用。当程序需要终止时,我需要关闭线程,但是它在select时被阻塞。
我的问题是,通过关闭文件描述符来通知线程我想终止的意图是一个好的做法吗?
是否有更好的方法来通知线程?我知道总是有一个选择使用信号,但是我在一些地方读到信号pthreads
不能很好地协同工作。
您可以使用管道,并将其添加到您的读取集。当线程应该终止时,在管道上发送一个字节。
或者设置select
呼叫超时,超时时检查是否有终止标志
除了由Joachim提出的温和方法之外,还有一些粗糙的方法来"interrupt"阻塞select()
:
- 使用
pthread_kill()
向阻塞线程发送信号,并在select()
之后测试(EINTR == errno)
- 调用
pthread_cancel()
线程id。select()
属于默认取消点集合