免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7356 | 回复: 15
打印 上一主题 下一主题

多线程长连接服务器端,线程资源的回收问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-25 16:23 |只看该作者 |倒序浏览
背景:主要是为了POS的接入提供服务,POS机通过海博通的网控器接入。
我要实现的功能:就是建立一个双工异步长连接的服务器端,与海波通的网控器实现长连接。

功能设计:1,创建一个服务器监听,用以接收客户端的连接(mian函数所做的操作)
          2,收到客户端的连接请求后创建一个字进程用于建立跟这个客户端的连接
          3,在字进程里创建一个接收线程和一个发送线程用以处理接收信息和发送信息
我主要是想,如果在创建的字进程里,做发送或者接收超时设置,如果超时,就直接exit,退出字进程。不知道这样是否存在问题。因为两个线程的资源可能都没有回收,而直接退出进程。

int main()
{
     InitSocket(ip, port);//监听
     while(1){
          clisock=accept(svrsock,0,0);
          if(fork = 0){
                  ConnFun();//如果收到一个监听,就创建一个字进程用于建立长连接。
          }

     }
}
//创建两个线程一个用于接收消息,一个用于发送消息
void ConnFun()
{
             pthread_t tid[2];
        void *pth_join_ret1;
        void *pth_join_ret2;
        int ret;
       
        //创建接收网控器消息的线程
        ret = pthread_create(&tid[0], NULL, doWorker1, NULL);
        if(ret != 0){
                close(clisock);
                exit(-1);
        }
                //创建发送网控器消息的线程
        ret = pthread_create(&tid[1], NULL, doWorker2, NULL);
        if(ret != 0){
                close(clisock);
                exit(-1);
        }
                ret = pthread_join(tid[0], &pth_join_ret1);
                ret = pthread_join(tid[1], &pth_join_ret2);
}

论坛徽章:
0
2 [报告]
发表于 2010-08-25 16:30 |只看该作者
要实现这个我现在有几个问题:
1,不先收回线程资源,直接exit是否会出现问题。
2,线程超时设置,我以前一直在做多进程编程,多线程不太熟悉,但是一个进程内肯定是不支持多个SIGALRM信号的。
3,如果我想先回收线程资源,再在主线程里退出,应该怎么实现呢。

论坛徽章:
0
3 [报告]
发表于 2010-08-25 17:24 |只看该作者
肯定有问题,你来个客户就创建一个子进程,一起来5000个客户你怎么办?

论坛徽章:
0
4 [报告]
发表于 2010-08-25 17:30 |只看该作者
但从进程退出考虑我认为没有问题,你的程序没有分配堆内存,不用回收。
进程退出了,里面的线程资源会自动回收。
我是这么认为的。

论坛徽章:
0
5 [报告]
发表于 2010-08-25 17:33 |只看该作者
根本就不应该这样设计,来了一个请求你创建一个子进程,然后在子进程中又创建2个线程,这么大的开销,你觉得你的服务器能抗的住几个连接,搞不好100都抗不住

论坛徽章:
0
6 [报告]
发表于 2010-08-25 18:29 |只看该作者
回复 5# @sky


    那应该怎么设计长连接呢。

论坛徽章:
0
7 [报告]
发表于 2010-08-25 18:35 |只看该作者
本帖最后由 dayuan555 于 2010-08-25 18:39 编辑

至于压力方面我倒是不担心,因为我问过了长连接最多也就6个,因为客户定的网控器只支持6个号码,如果连接过多只能排队。

论坛徽章:
0
8 [报告]
发表于 2010-08-25 22:41 |只看该作者
兄弟们给点意见撒

论坛徽章:
0
9 [报告]
发表于 2010-08-26 10:57 |只看该作者
你就用一个进程搞定就行了,长不长连接跟你起的进程数量没有关系。

论坛徽章:
0
10 [报告]
发表于 2010-08-26 10:59 |只看该作者
多线程也可以注册一个清理函数,运行完毕自己清理掉就OK了。资源共享也比多线程方便。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP