在多个进程之间协调侦听套接字的接受的最佳方法是什么?
我正在考虑以下两种方式之一:
有一个“主”进程,当轮到它开始接受连接时,它会向每个进程发送一条消息。
所以序列将是:
主进程为工作者A提供令牌。工作者A接受连接,将令牌返回给主进程。主进程为工作者B等提供令牌
每个进程都有一个接受线程,它将绕着共享的互斥锁旋转。锁定互斥锁,接受连接,释放锁定。
有更好的想法吗?
答案 0 :(得分:1)
我认为主解决方案也是不错的选择:
/* 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;
如果您发现带有进程的解决方案很慢,则可以使用threads
(它们共享相同的内存),但代码可能会增加复杂性并且跟踪错误可能很难。
第二种解决方案并不比第一种解决方案快,因为获取互斥锁的成本和所有进程之间的上下文切换。
答案 1 :(得分:1)
1)我不确定为什么你不想要多个“线程”而不是“进程”。
但是,如果您需要一个工作流程池(与“工作线程”相比),那么我建议:
2)主进程绑定,侦听...并接受所有传入连接
3)使用“Unix套接字”将接受的连接从主进程传递给工作进程。
4)就“同步”而言 - 简单。工作人员只是阻止读取Unix套接字,直到有一个新的文件描述符开始使用它。
5)您可以为工作人员设置共享内存块,以便将“忙/闲”状态传达给主人。
以下是使用“Unix域套接字”的讨论:
Stevens“网络编程”也是一个很好的资源:
答案 2 :(得分:0)
只是我最终使用的更新(3):当连接进来时,所有进程都被唤醒。在接受连接之前,他们尝试锁定共享的互斥锁。首先锁定互斥锁的那个接受连接。
这比来回传递令牌要快得多。
全部谢谢!