Multithreading 序列化任务分发:使用线程还是epoll?

Multithreading 序列化任务分发:使用线程还是epoll?,multithreading,networking,Multithreading,Networking,现在我的处境是,有一组预定义的任务供多个客户机执行(任何客户机都可以执行任何任务)。当客户端连接到服务器时,服务器从未完成的任务中选择一个任务并将其发送到客户端——服务器端的作业非常简单。客户端完成任务并将结果发送回服务器需要一段时间 由于一个任务应该只发送到一个客户机,所以服务器应该以序列化的方式处理请求。现在我有两个计划:为每个客户端连接创建一个线程,所有线程轮流访问任务池,或者使用epoll监听客户端的每个事件的所有连接和进程 哪一个更适合这份工作?或者还有其他想法吗?服务器将在多核机器上

现在我的处境是,有一组预定义的任务供多个客户机执行(任何客户机都可以执行任何任务)。当客户端连接到服务器时,服务器从未完成的任务中选择一个任务并将其发送到客户端——服务器端的作业非常简单。客户端完成任务并将结果发送回服务器需要一段时间

由于一个任务应该只发送到一个客户机,所以服务器应该以序列化的方式处理请求。现在我有两个计划:为每个客户端连接创建一个线程,所有线程轮流访问任务池,或者使用epoll监听客户端的每个事件的所有连接和进程


哪一个更适合这份工作?或者还有其他想法吗?服务器将在多核机器上运行。

主要问题是服务器是否有重要的处理任务要做,以便为客户端准备任务。如果没有,那么使用多个线程就没有什么好处——相反,上下文切换只会增加开销。在这种情况下,最好使用
epoll
(最有可能通过一些现有库,具体取决于您使用的编程语言)

如果服务器端有重要的处理,它可能会抵消上下文切换的低效性,并通过从多个核心获得并行性来提高性能。要确定最佳解决方案是什么,唯一的方法是进行一些原型设计和分析

客户端是否与服务器运行在同一台机器上?
如果是,您将能够轻松地使用多核。

您可以同时使用这两种核。您可以让多个线程在同一个fd集合上运行
epoll()
,操作系统将根据需要唤醒线程。这也很容易做到——特别是在不需要任何共享的情况下:只需将
fork()
50次左右,Linux将在需要时切换上下文,不需要时进行epoll。当我这么做的时候,我只是做了这样的事情:

{char*s=getenv("THREADS");int n=atoi(s?s:"0"),i;
 for(i=0;i<n;i++)if(fork()==0)break;}
{char*s=getenv(“线程”);intn=atoi(s?s:“0”),i;

对于(i=0;i)来说,准备任务是一项很小的工作。谢谢。我会把这一点放到我的问题中。客户端运行在不同的机器上。谢谢你的建议。但是我不希望程序这么复杂。我宁愿用更简单的方式编写。现在我已经完成了服务器的主要部分,每个连接模式一个线程就可以了。