Jas*_*n R 5 sockets multithreading interrupt system-calls
我有一些代码产生了一个pthread试图维持与远程主机的套接字连接的代码.如果连接丢失,它会尝试使用connect()其套接字上的阻塞调用重新连接.由于代码在一个单独的线程中运行,我并不真正关心它使用同步套接字API的事实.
也就是说,直到我的应用程序退出时.我想执行一些有序关闭的外观,所以我使用线程同步原语唤醒线程并发出信号让它退出,然后pthread_join()在线程上执行一个等待它完成.这很好用,除非connect()在我命令关闭时线程处于调用的中间.在这种情况下,我必须等待连接超时,这可能需要很长时间.这使得应用程序似乎需要很长时间才能关闭.
我想做的是以connect()某种方式中断呼叫.调用返回后,线程会注意到我的退出信号并干净地关闭.由于connect()是系统调用,我认为我可能会故意使用信号中断它(从而使调用返回EINTR),但我不确定这是否是POSIX线程环境中的健壮方法.
有没有人建议如何使用信号或通过其他方法?请注意,connect()我无法修改某些库代码中的调用,因此不能选择更改为非阻塞套接字.
尝试关闭()套接字以中断connect().我不确定,但我认为它至少可以在Linux上运行.当然,要小心正确同步,这样你只需要关闭()这个套接字一次,或者理论上第二个close()理论上可以关闭刚刚打开的无关文件描述符.
编辑:shutdown()可能更合适,因为它实际上并没有关闭套接字.
或者,您可能需要查看pthread_cancel()和pthread_kill().但是,我没有看到在没有竞争条件的情况下使用这两种方法的方法.
我建议您放弃多线程服务器方法,而不是事件驱动,例如使用epoll进行事件通知.通过这种方式,您可以避免所有这些基本问题变得非常困难,例如正确关闭.您随时可以随心所欲地做任何事情,例如安全地关闭插座,不要再听到他们的声音.
在另一方面,如果你的工作线程你做一个非阻塞连接() ,并通过epoll_pwait()得到通知(或ppoll()或PSELECT() ;注意p),你可能能够避免相关的竞态条件有信号.