我还认为高手的解决方案是不错的选择:
/* 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
代替(它们共享相同的内存),但代码可能会增加复杂性并且跟踪错误可能很难。
第二个解决方案不会比第一个解决方案快,因为获取互斥锁的成本以及所有进程之间的上下文切换成本。
来源
2012-08-10 18:38:01
TOC
如果我是你,我会用主人的方法。 – 2012-08-10 17:47:11
感谢您的建议。我目前已经实现了这个(主进程发送消息作为令牌),但我认为它太慢了。对于每个接受,我进行以下“额外”系统调用。工人调用“send()”发回令牌。主睡眠是“select()”调用“recv()”来获取令牌。然后调用“send()”将令牌发送给工作者B,并返回到“select()”的睡眠状态。工人B调用“recv()”来接受令牌。所以我觉得它可能太慢了...... – 2012-08-10 18:15:59