假设有2个线程,T1和T2。
T1正在选择一组套接字并执行相应的读/写操作。 现在,如果线程T2想要关闭线程T1(即加入它),那么如果T1在选择系统调用时被阻止,我怎么能这样做呢?如何中断选择呼叫?
答案 0 :(得分:1)
如果你想在线程T1之后能够自己清理,那么更好的答案就是从T2发送一个信号(我之前使用过USR1信号),这会导致select()在T1中调用以返回值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将结束。
答案 1 :(得分:0)
由于你只想杀死线程,这应该可行。
在T1:
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
select(...);
在T2:
pthread_cancel(t1);
pthread_join(t1, &retval);