C 在多个进程之间协调共享侦听套接字的接受
协调多个进程之间侦听套接字的接受的最佳方法是什么 我在想两种方法之一:C 在多个进程之间协调共享侦听套接字的接受,c,sockets,C,Sockets,协调多个进程之间侦听套接字的接受的最佳方法是什么 我在想两种方法之一: 有一个“主”进程,当轮到它开始接受连接时,它将向每个进程发送消息 因此,顺序将是: 主进程将令牌交给工作进程A。工作进程A接受连接,将令牌交还给主进程。主进程向工人B等提供令牌 每个进程都有一个接受线程,该线程将围绕一个共享互斥体旋转。锁定互斥锁,接受连接,释放锁 还有更好的主意吗 当连接进入所有进程时,所有进程都会被唤醒。在接受连接之前,他们会尝试锁定共享互斥锁。锁定互斥锁的人首先接受连接 我认为主解决方案也是一个不
- 有一个“主”进程,当轮到它开始接受连接时,它将向每个进程发送消息 因此,顺序将是: 主进程将令牌交给工作进程A。工作进程A接受连接,将令牌交还给主进程。主进程向工人B等提供令牌
- 每个进程都有一个接受线程,该线程将围绕一个共享互斥体旋转。锁定互斥锁,接受连接,释放锁
- 当连接进入所有进程时,所有进程都会被唤醒。在接受连接之前,他们会尝试锁定共享互斥锁。锁定互斥锁的人首先接受连接
- 我认为主解决方案也是一个不错的选择:
/* Process struct */
typedef struct _process_t {
unsigned long process_id;
struct _process_t *next; /* next process */
struct _process_t *prev; /* previous process */
struct _process_master *master_process; /* Master process */
int (*accepting_socket) (struct _process_t *); /* process accepet function */
char *received_data_buffer; /* the data received over the socket */
} process_t;
/* List of process */
typedef struct _process_list {
process_t *head;
process_t *tail;
int count;
} process_list;
/* The master process */
typedef struct _process_master {
process_list socket_listners; /* All the process listening */
process_list ready_listners; /* Process ready to listen and receive*/
..... /* Complete this struct */
} process_master;
如果您发现进程的解决方案很慢,您可以使用线程
(它们共享相同的内存),但是代码可能会增加复杂性,并且跟踪bug可能很困难
第二种解决方案并不比第一种解决方案快,因为获取互斥的成本和在所有进程之间切换上下文的成本。1)我不确定为什么您不希望多个“线程”而不是“进程”
但是如果您需要一个工作进程池(相对于“工作线程”),那么我建议:
2) 主进程绑定、侦听。。。并接受所有传入连接
3) 使用“Unix套接字”将接受的连接从主进程传递到工作进程
4) 至于“同步”,很简单。worker只是阻止读取Unix套接字,直到有一个新的文件描述符供其开始使用
5) 您可以为工作者设置共享内存块,以便将“忙/闲”状态传送给主机
下面讨论如何使用“Unix域套接字”:
谢谢大家 如果我是你,我会选择大师级的方法。谢谢你的建议。我目前已经实现了这个(主进程将消息作为令牌发送),但是我认为它太慢了。对于每个accept,我都会进行以下“额外”系统调用。工作者调用“send()”发回令牌。主休眠是“select()”调用“recv()”来获取令牌。然后调用“send()”将令牌发送给Worker B,并返回“select()”中的睡眠状态。工作者B调用“recv()”以接受令牌。所以我想可能太慢了…谢谢!关于互斥体获取和上下文切换;即使在主从式场景中,上下文切换也会发生。我只是在想,获取互斥可能比主-工作者场景中需要的所有系统调用都要快。谢谢你的建议!谢谢对于工作人员,我宁愿使用进程而不是线程。将套接字从一个进程发送到另一个进程的想法听起来确实很有趣。也就是说,让一个进程执行所有的接受操作,并将其发送给工作进程进行进一步处理。我会试一试的!谢谢