免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: guojinshuai
打印 上一主题 下一主题

[网络] select+多线程 问题好纠结,愁死了 [复制链接]

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
11 [报告]
发表于 2015-04-02 15:59 |只看该作者
guojinshuai 发表于 2015-04-02 15:55
回复 9# hellioncu


select线程发现可读直接就读了,读到的数据直接自己处理,或者交由其他线程处理。

上述线程可以是多个,每个线程负责部分socket

论坛徽章:
0
12 [报告]
发表于 2015-04-02 16:06 |只看该作者
回复 11# hellioncu

有木有个伪代码或者例子,我学习下,思路大概能听懂,但是写代码就有点捉急了。。
   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
13 [报告]
发表于 2015-04-02 16:26 |只看该作者
guojinshuai 发表于 2015-04-02 16:06
回复 11# hellioncu

有木有个伪代码或者例子,我学习下,思路大概能听懂,但是写代码就有点捉急了。。
...


我没有适合给你的,你网上找找讲select的文章、书之类的吧

论坛徽章:
0
14 [报告]
发表于 2015-04-02 16:39 |只看该作者
回复 13# hellioncu


    找了,跟线程池相关的没找到。
   像你说的select发现有数据可读时,就让线程read,那这个线程怎么知道可读呢?
   总不能当有数据可读时就创建一个线程读数据,这样频繁的创建线程消耗更大! 应该就是利用线程池的原理,提前创建好3个线程,然后读数据。但是我不知道该怎么完善优化我的代码,还是见过的好代码太少了,太高级的代码又看不懂。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
15 [报告]
发表于 2015-04-02 16:44 |只看该作者
guojinshuai 发表于 2015-04-02 16:39
回复 13# hellioncu


“select线程发现可读直接就读了”,是同一个线程

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
16 [报告]
发表于 2015-04-02 16:50 |只看该作者
你这么写是不是每个线程都在互斥锁 pthread_mutex_lock(&lock); 处进行等待

等前一个线程把锁放了,后面的线程才能进去接着干活,和串行执行也没啥区别,徒增了线程调度开销

我觉得应该给每个线程分一个队列,主线程负责往队列里面塞任务,线程内部从队列取任务执行,这样才能达到并行的效果



回复 10# guojinshuai


   

论坛徽章:
0
17 [报告]
发表于 2015-04-02 16:54 |只看该作者
回复 15# hellioncu


    主线程直接读?这种设计方式更不好,主线程不能参与IO读写。你说的是创建一个子线程用于select吧,然后这个子线程select到可读,就直接用这个子线程read?
   

论坛徽章:
0
18 [报告]
发表于 2015-04-02 17:17 |只看该作者
回复 16# asdf2110


    现在我的代码不就是这么做的吗?主线程往队列添加任务,3个一直运行的子线程从队列取任务进行read。
   你觉得该怎么写代码?能不能给个伪代码啥的?

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-08 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-08-29 06:20:00数据库技术版块每日发帖之星
日期:2015-09-18 06:20:00数据库技术版块每周发帖之星
日期:2015-11-06 19:56:51数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00数据库技术版块每日发帖之星
日期:2016-02-05 06:20:00
19 [报告]
发表于 2015-04-02 22:26 |只看该作者
但是你看你的代码
3个线程能同时 read 吗?
所以你得改成可以同时read
简单修改就是线程从list中取出任务并从list中删除该任务后,立即释放lock,read 操作可放在 unlock 后执行,这样至少read可以并行了


回复 18# guojinshuai


   

论坛徽章:
0
20 [报告]
发表于 2015-04-03 10:02 |只看该作者
回复 19# asdf2110


    我修改下,体验一下。O(∩_∩)O
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP