回去打印一下,研究一下memcached,每个线程一个ConnectQueue(CQ),主线程将数据分发到每个线程的CQ当中。
CQ当中的每个元素的类型为
-
struct conn_queue_item {
-
int sfd;
-
enum conn_states init_state;
-
int event_flags;
-
int read_buffer_size;
-
enum network_transport transport;
-
CQ_ITEM *next;
-
};
这个类型的最关键的元素就是sfd,表示了该socket连接。
然后这个线程为这个队列中的元素在内存中维护一个conn的结构。
如下就是为该连接注册事件及其回调函数,并将该事件绑定到该线程的base上。
-
event_set(&c->event, sfd, event_flags, event_handler, (void *)c);
-
event_base_set(base, &c->event);
-
c->ev_flags = event_flags;
-
-
if (event_add(&c->event, 0) == -1) {
-
if (conn_add_to_freelist(c)) {
-
conn_free(c);
-
}
-
perror("event_add");
-
return NULL;
-
}
以后如果有用户与memcached进行交互,那么可以直接由该线程执行绑定的回调函数event_handler,完成对已建立连接的请求的处理。
阅读(2982) | 评论(1) | 转发(0) |