第一次用epoll去实现一个服务器,
之前并不清楚epoll的用法,
了解之后才发现epoll服务器的主线程其实最好和处理业务的代码分开,
也就是说:
epoll响应外界的io请求,当epoll得到一个请求的时候,扔到一个消息队列中,然后epoll直接返回,再去等待io请求.而消息队列会通知多个线程去处理这些业务逻辑.
epoll第一次用,消息队列更是第一次用,开始一直在想,怎么写个阻塞的队列,而且要有主动通知的功能,想了一会儿发现pthread_cond_wait和pthread_cond_signal可以实现,于是就简单的试试,下面的代码已经可以实现我刚才想要得到的那个模型,细节就不管了.
对消息队列熟悉的同学请帮忙提点意见,并告诉我下还有哪些方法可以实现阻塞的消息队列.
对代码的解释和描述都写到注释中了.
/*
几个用到的类型定义以及全局变量bq
*/
char smtp_cmd_format;
struct epoll_event ev, events[MAX_EPOLL_SIZE];
int kdpfd,nfds;
struct block_queue
{
int queue[THREADS_COUNT];
long size;
pthread_cond_t cond;
pthread_mutex_t mutex;
}block_queue_t;
block_queue_t bq;
struct block_queue_param
{
void* func;
void* queue;
}block_queue_param_t;
void *block_queue(void * param)
{
void(* func)(void* );
int fd,i;
/*
由于block_queue是pthread_create的回调方法,
所以block_queue的参数必须是void*类型
*/
block_queue_t* bque = (block_queue_param_t*)param->queue;
/*
param->func是block_queue解锁时需要调用的函数,
而这个函数的参数是一个int fd,
该fd是消息队列中刚刚插入的一个元素.
*/
func = (block_queue_param_t*)param->func;
for(;;)
{
/*
lock->wait->unlock
这是经典的模式,
切记: