繁体   English   中英

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

[英]How can I exit from a select system call at any random time?

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

T1 在一组套接字上进行选择并执行相应的读/写操作。 现在,如果线程 T2 想要关闭线程 T1(即加入它),那么如果 T1 在 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM