Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/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
Pthreads 本地多线程服务器:如何简化?_Pthreads_Client Server_Epoll - Fatal编程技术网

Pthreads 本地多线程服务器:如何简化?

Pthreads 本地多线程服务器:如何简化?,pthreads,client-server,epoll,Pthreads,Client Server,Epoll,有一个任务-我需要一个具有以下属性的客户端服务器应用程序: 客户端使用阻塞套接字 服务器是被动的:他接受传入的连接,获取一些数据,对其进行处理并将结果发送回来 服务器有几个线程(主线程除外),从1到大约100个 所有操作都在一台计算机上,即客户端和服务器都使用本地主机 传输数据的最大大小约为1KB 首先,我实现了基于epoll的服务器: 主线程使用epoll执行IO,工作线程执行数据处理 所有服务器套接字都是非阻塞的 服务器有两个队列:主线程放置客户端请求的传入队列和主线程获取回复的传出队

有一个任务-我需要一个具有以下属性的客户端服务器应用程序:

  • 客户端使用阻塞套接字
  • 服务器是被动的:他接受传入的连接,获取一些数据,对其进行处理并将结果发送回来
  • 服务器有几个线程(主线程除外),从1到大约100个
  • 所有操作都在一台计算机上,即客户端和服务器都使用本地主机
  • 传输数据的最大大小约为1KB
首先,我实现了基于epoll的服务器:

  • 主线程使用epoll执行IO,工作线程执行数据处理
  • 所有服务器套接字都是非阻塞的
  • 服务器有两个队列:主线程放置客户端请求的传入队列和主线程获取回复的传出队列
我的设计是可行的,但后来我又重新考虑了这个设计:它没有考虑localhost。它更普遍,因此更复杂。如果做得比现在简单就好了

因此:

  • 主线程执行epoll_等待、接受和管理连接队列。连接队列是主线程放置已接受连接的队列
  • 侦听套接字是非阻塞的。接受的套接字正在阻塞
  • 当任何套接字变得可读时,主线程唤醒工作线程,工作线程在阻塞模式下执行recv,在阻塞模式下处理和发送
你觉得怎么样?这个设计够好吗


谢谢你的评论

把多线程的东西扔出窗外。在计算受限之前,不需要涉及多线程。就性能而言,过早地涉及线程是一个净负面影响,并给项目增加了巨大的复杂性。只需在主线程上完成所有工作,并使用epoll多路复用I/O即可。Eric,你是说在IO中使用线程吗?