如何在任何随机时间退出选择系统调用?

时间:2015-06-09 13:51:43

标签: c++ linux network-programming

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

T1正在选择一组套接字并执行相应的读/写操作。 现在,如果线程T2想要关闭线程T1(即加入它),那么如果T1在选择系统调用时被阻止,我怎么能这样做呢?如何中断选择呼叫?

2 个答案:

答案 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);