- 论坛徽章:
- 0
|
本帖最后由 osmanthusgfy 于 2011-03-07 16:28 编辑
leader/followers模式怎样高效地避免竞争状态的出现?
比如一个follower线程在某个sockfd上接收数据,需要很常时间(如传输文件),
这时leader线程调用reactor,得到可读的sockfd正是follower线程正在操作的sockfd,
这时就出现了竞争状态.
所以,一般使用leader/followers模式时要避免竞争状态的出现.
我想到一种方式:就是一个老外在多线程情况下使用libevent提出的一种思路:
使用socketpair创建一个unix域套接字.然后将这个套接字注册到reactor(比如epoll,select).
我仿照这种思路,可以在reactor中封装一个当前活动的sockfd的队列,这个队列中装的是当前被follower线程
操作的sockfd,每当leader线程调用reactor分离事件时,先在这个活动队列中查找这个sockfd,如果能找到,
则说明有某个follower线程正在操作这个sockfd,我们应该重新调用reactor,重新得到一个就绪的sockfd.
如果follower线程处理完毕,然后通过先前创建好的unix域套接字发送消息,请求将操作完毕sockfd从当前活动队列中
删除,这样就避免竞争状态的出现.
客户端连接达到很大数量后,我这种思路就出现性能低效的问题:
首先是每次leader->follower转变前,都必须在当前活动队列中查找一边;
其次,follower->leader转变前,又得将sockfd从当前活动队列中删除.
连接很多时,以上两步还是挺费时的,特别是查找.
有没有更好的解决方案了,希望大家赐教,谢谢!!! |
|