首先在进程中,libevent的一个base实际上就是一个while循环,当系统内核捕捉到事件发生时,它就会按照事件的优先级将这些捕捉到的事件,用注册时的回调函数处理。怎样和多线程一起用呢?我认为有两个解决方案。
一、将监听accept和连接connect注册到一个base上,当有事件触发时,开新的线程处理接受到的数据。
二、使用1+N个线程,每个线程一个base。
1个监听线程,他只负责监听连接。有新的客户端连接进来时,将连接的socket交个某个线程处理。这里可以采用轮询策略。
N个处理客户端业务的线程,每个线程只负责自己的客户端时间。线程间互不干扰。每个线程都应该有一对管道,业务线程监听读时间,监听线程则在有新的客户端连接时,将socket写到某个业务线程的队列里,并向该线程的管道写操作,以触发该线程的管道多事件,进而线程知道有个新的客户端需要自己服务,从队列里取出socket,并监听读事件。