免费注册 查看新帖 |

Chinaunix

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

[网络] 对套接字api这本书的线程池范例有质疑,希望大家进来看看,告诉我原因 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-16 21:15 |只看该作者 |倒序浏览
在unix网络编程 卷1 套接字api 这本书里面有一个线程池的范例

范例名字是 tcp预先创建线程服务器程序,每个线程各自accept

有一段代码是这样子的

for( ;;){
   clilen = addrlen;
   pthread_mutex_lock (&mlock);
   connfd = accept(listenfd, cliaddr ,&clilen);
   pthread_mutex_unlock(&mlock);
   tptr[(int) arg].thread_count++;

  web_child(connfd);        
  close (connfd);


这个线程假如第一次得到了互斥锁,从而和一个客户端建立了连接

如果此线程运气很好,又得到了互斥锁

那么问题来了,前面连接上的那个客户端会不会被掉线

拓宽一下,如果线程池采用各自accept的方式,那么在很多客户端连接的情况下。

会不会发生某一个线程多次得到互斥锁,与多个客户端建立联系这样的错误

论坛徽章:
0
2 [报告]
发表于 2015-04-17 16:19 |只看该作者
突然冒出来一个想法

如果在每个线程里面创建一个数据结构,

然后把每个accept到的服务套接字放到数据结构里面,然后在线程与客户端通信的实现里用异步轮询数据结构里面的所有服务套接字。

这样一来,问题或许迎刃而解了

论坛徽章:
0
3 [报告]
发表于 2015-04-17 16:21 |只看该作者
如果这样子成功的话,

服务器可以同时通信的客户端数量就是

线程池中的线程数  乘以  各线程中数据结构里面存放的服务套接字数量

论坛徽章:
0
4 [报告]
发表于 2015-04-17 17:06 |只看该作者
其实没有用,

万一连数据结构都满了呢

论坛徽章:
0
5 [报告]
发表于 2015-04-22 14:07 |只看该作者
现在已经解决了

论坛徽章:
0
6 [报告]
发表于 2015-04-26 15:03 |只看该作者
设置一个条件进行判断就可以了,满足条件->accpet

论坛徽章:
0
7 [报告]
发表于 2015-05-22 19:13 |只看该作者
在第二次得到互斥锁之前,必定先close套接字,第一个链接肯定断了啊!!

论坛徽章:
0
8 [报告]
发表于 2015-06-02 14:31 |只看该作者
谢谢你的回复,你说的没错回复 7# a1421117


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP