- 论坛徽章:
- 7
|
本帖最后由 cxytz01 于 2013-01-10 12:22 编辑
重新来描述下吧,确实描述不清楚。 当时正搞得焦头烂额。
需求:
高并发服务器,目前使用的是常规非阻塞IO + select + 短链接(一笔业务链接过来,处理完毕就关闭socket,同时初始化sockfd数组对应元素为-1)。不使用epoll。
定义数组: int gt_sockfd[FD_SETSIZE] //FD_SETSIZE目前为1024,后期会把select改成poll方式,支持更多的连接,上万。
数组初始值: 每个元素为-1(标识为没有被使用)
数组元素会按由低下标,到高下标的 顺序使用, 被使用时,其值会被置成一正数。当该元素被使用后,会再次被初始化成-1。 元素被再次初始化的顺序是不确定的,不一定从低下标到高下标的顺序初始化,完全随机。
每当数组元素变化(不管是初始化成-1,还是被赋值成正数),我都需要计算最大的数组元素。 /* 可以不用每次数组元素变化都计算一次, 每隔一段时间计算一次即可,但本着抠门的精神,就想抠一抠这样的方式。*/
代码
for (; {
...
select(maxfd + 1, &listenfd_set.....);
connfd = accept(listenfd ...........);
pthread_mutex_lock(..);
for (i = 0; i < FD_SETSIZE; i++) { /* 存储fd,用于其他线程使用,其他线程使用完毕,将其置位为-1 */
if (gt_sockfd == -1) {
gt_sockfd = connfd;
如果gt_sockfd 比当前 maxfd大,那么就设置maxfd 为 gt_sockfd
break;
}
}
pthread_mutex_unlock(..);
/* 该for循环, 不断的循环啊循环啊,maxfd总会不停的变大。 而select总是不停的轮询maxfd个数据,随着maxfd的增大,select效率会降低。而且maxfd如果不做处理,总有一天会溢出。
这里也可以指定当maxfd达到某一数值之后,才重新计算下maxfd。 但是如果我想每次for循环都计算maxfd(本着抠的精神,没事找茬的精神),可又怕效率过低,所以发帖请教一好的计算maxfd的算法。。
*/
...........
}
|
|