Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多线程Linux套接字编程设计_Multithreading_Sockets_Network Programming_Pthreads_Producer Consumer - Fatal编程技术网

Multithreading 多线程Linux套接字编程设计

Multithreading 多线程Linux套接字编程设计,multithreading,sockets,network-programming,pthreads,producer-consumer,Multithreading,Sockets,Network Programming,Pthreads,Producer Consumer,到目前为止,我一直在尝试编写一个支持一个客户机的服务器程序,在我尝试开发它的几天里,我得出结论,我需要线程。之所以做出这样的决定,是因为我从wifi套接字获取输入,然后对其进行处理,最后写入文件,处理时间很慢,因此我需要一个输入线程->循环缓冲->输出线程模式以及生产者-消费者模型,这在网络编程中非常常见 现在,情况变得复杂了,因为我需要管理客户端断开连接和重新连接。我考虑使用pthread_exit()清理所有信号量,然后在每次单客户端重新连接时重新初始化它们 我的问题是,这是否是一种有效的方

到目前为止,我一直在尝试编写一个支持一个客户机的服务器程序,在我尝试开发它的几天里,我得出结论,我需要线程。之所以做出这样的决定,是因为我从wifi套接字获取输入,然后对其进行处理,最后写入文件,处理时间很慢,因此我需要一个输入线程->循环缓冲->输出线程模式以及生产者-消费者模型,这在网络编程中非常常见

现在,情况变得复杂了,因为我需要管理客户端断开连接和重新连接。我考虑使用pthread_exit()清理所有信号量,然后在每次单客户端重新连接时重新初始化它们

我的问题是,这是否是一种有效的方法,即每次杀死线程和信号量并重新创建它们。有没有更好的解决办法


谢谢。

一些评论和建议

1-In TCP检测到另一方已悄悄断开连接,即使不是不可能,也是非常困难的。客户端可以断开向服务器发送RST TCP消息或发送FIN消息的连接,这是一个很好的例子。有时,客户端可以在没有通知的情况下断开连接(崩溃、电缆断开等)

    这里有一个建议是考虑客户端和服务器之间的通信方式。例如,您可以使用“选择”功能设置从客户端接收消息的超时,并检测静默客户端

  • 此外,根据编程语言和操作系统的不同,对于试图通过客户端关闭的连接发送消息的服务器,您可能需要处理断管(SIGPIPE)信号(在Linux中,使用C/C++)

关于信号量,当客户端断开连接时,不需要以任何特殊方式清理信号量。通过应用锁定和解锁互斥锁的常见良好实践,就足够了。同样对于文件描述符等资源,您需要在结束线程之前释放它们,方法是从threadstart函数返回,或者使用pthread_exit。也许我不明白问题的这一部分

3-关于线程:如果您使用多个线程,那么最佳的做法是拥有一个预创建的使用者/工作者线程池,该线程池将检查循环缓冲区以使用下一个可用连接。创建和销毁线程对操作系统来说代价高昂

  • 线程会消耗资源,例如,如果需要创建1000个线程,可能会耗尽操作系统资源

  • 另一种选择是,只有一个使用者线程异步管理所有连接(套接字):a)每个连接都有自己的状态。b) 主线程遍历所有连接,并使用函数“select”检测连接读取或写入何时准备就绪。3) 使用非阻塞套接字,但这不是必需的,因为通过选择,您知道哪些套接字已准备就绪且不会阻塞

  • 您可以使用函数select、poll、epoll

一个关于选择和非阻塞套接字的链接: 其他链接与示例:

我的问题是,这是否是一种有效的方法,即每次杀死线程和信号量并重新创建它们。有没有更好的解决办法

  • 了解如何使用非阻塞套接字和事件循环。或者使用在引擎盖下使用非阻塞套接字为您提供TCP会话的库。比如
  • 了解如何使用多线程,而不使用任何同步原语污染代码,方法是使用消息传递在线程之间进行通信,而不是共享状态。用于非阻塞I/O的事件循环库还应提供跨线程消息传递的方法

  • 在编辑时,我使用简单的标志来通知线程停止并最终加入。它适用于两个连接,第三个连接面临问题。关闭上一个套接字和新套接字时是否应该延迟一些时间。在为新连接创建任何新套接字fd之前,我将关闭所有描述符。您是否使用标准套接字函数,如绑定、侦听、接受等?你粘贴的代码对我来说没有多大意义。