gpt4 book ai didi

multithreading - 如何中断执行阻塞套接字连接的线程?

转载 作者:行者123 更新时间:2023-12-04 06:48:43 25 4
gpt4 key购买 nike

我有一些生成 pthread 的代码试图保持与远程主机的套接字连接。如果连接丢失,它会尝试使用阻塞 connect() 重新连接。调用它的套接字。由于代码在单独的线程中运行,因此我并不真正关心它使用同步套接字 API 的事实。

也就是说,直到我的应用程序退出为止。我想执行一些有序关闭的外观,所以我使用线程同步原语来唤醒线程并发出退出信号,然后执行 pthread_join()在线程上等待它完成。这很好用,除非线程位于 connect() 的中间当我命令关机时调用。在这种情况下,我必须等待连接超时,这可能需要很长时间。这使得应用程序看起来需要很长时间才能关闭。

我想做的是中断对 connect() 的调用某种程度上来说。调用返回后,线程会注意到我的退出信号并干净利落地关闭。自 connect()是一个系统调用,我认为我可以使用信号故意中断它(从而使调用返回 EINTR ),但我不确定这在 POSIX 线程环境中是否是一个健壮的方法。

有没有人对如何做到这一点有任何建议,无论是使用信号还是通过其他方法?请注意,connect()在我无法修改的某些库代码中调用已关闭,因此更改为非阻塞套接字不是一种选择。

最佳答案

尝试 close() 套接字以中断 connect()。我不确定,但我认为它至少可以在 Linux 上运行。当然,要注意正确同步,以便您只 close() 这个套接字一次,或者第二次 close() 理论上可以关闭刚刚打开的无关文件描述符。

编辑 : shutdown() 可能更合适,因为它实际上并没有关闭套接字。

或者,您可能想看看 pthread_cancel()pthread_kill() .但是,我没有看到在没有竞争条件的情况下使用这两个的方法。

我建议你放弃多线程服务器方法,转而使用事件驱动,例如使用 epoll用于事件通知。通过这种方式,您可以避免所有这些非常基本的问题,这些问题在线程中变得非常困难,例如正确关闭。您可以随时做任何想做的事情,例如安全地关闭套接字,再也不会收到它们的消息。

另一方面,如果在您的工作线程中执行非阻塞 connect() 并通过 epoll_pwait()(或 ppoll() 或 pselect();注意 p)获得通知,您可能能够避免相关的竞争条件与信号。

关于multithreading - 如何中断执行阻塞套接字连接的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com