我怎样才能在任意时间退出select系统调用?

假设有2个线程,T1和T2。

T1在一组套接字上select并执行相应的读/写操作。 现在,如果线程T2想要closures线程T1(即join它),那么如果T1在select系统调用时被阻塞,我该怎么做呢? 我如何中断select呼叫?

如果你希望能够在线程T1之后自行清理,一个更好的答案是从T2发送一个信号(我之前使用了USR1信号),这将导致T1中的select()调用返回具有EINTR的值。

然后你可以检查EINTR并知道你需要做一些清理工作。 在我的情况下,我有一个单独的线程在一个无限的阻塞select()等待阅读,在一个退出标志的while循环。

while ( !exit_flag ) { ... int select_retval = select( ... ); switch ( select_retval ) { case EINTR: /* clean up */ break; default: break; } } 

我会设置从T2出口标志,然后发送信号到T1。 T1然后清理,然后离开循环。 在我的情况下,循环是在T1中运行的功能,因此T1会结束。

既然你只是想杀死线程,这应该工作。

在T1中:

 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); select(...); 

在T2中:

 pthread_cancel(t1); pthread_join(t1, &retval);