免费注册 查看新帖 |

Chinaunix

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

如何让线程创建后立即运行,我用的方法是否正确? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-08 10:40 |只看该作者 |倒序浏览
            pthread_t           tmp_thr;
            pthread_attr_t      tmp_attr;
            struct sched_param  tmp_sch;
            pthread_attr_init ( &tmp_attr );
            pthread_attr_setdetachstate ( &tmp_attr, PTHREAD_CREATE_DETACHED );

            pthread_create ( &tmp_thr, &tmp_attr, &ProcessThread, pa );

            tmp_sch.sched_priority = 1;
            pthread_setschedparam ( tmp_thr, SCHED_FIFO, &tmp_sch );
            pthread_attr_destroy ( &tmp_attr );
            //pthread_detach ( tmp_thr );


我在守护程序中大量创建线程时发现 pthread_create 会卡住, 这个情况在30个客户端请求的时候就可以重现.在改成以上的代码后,线程不会再卡住.这里用到的一些东西以前没接触过,APUE里也没讲怎么让线程创建后立即执行. 有什么不正确的请指点一下...

[ 本帖最后由 我learnc 于 2009-4-8 10:45 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-08 10:53 |只看该作者
你创建一个或者若干个线程后,它们就开始和主线程争夺进程的CPU时间了。。。
所以,如果你循环创建大量线程时,那么肯定会“卡”住的

论坛徽章:
0
3 [报告]
发表于 2009-04-08 10:55 |只看该作者

回复 #1 我learnc 的帖子

不知道楼主大大怎么会这样。
小弟创建上百个线程都没事。
另外。小弟的经验,如果需要创建很多线程,最好提前创立好,不要频繁创建销毁。
也就是所谓的线程池,把你的任务均匀的分配给他们。
通常认为,线程池为了减少创建线程的时间开销。
不过小弟觉得,更大的好处是,减少了出错的风险,如果创建线程时出错,刚开始就知道,好控制。
至于参数,主要是利用创建线程函数时的参数,或者直接用全局的变量,起到控制线程,传递参数的目的。

论坛徽章:
0
4 [报告]
发表于 2009-04-08 11:04 |只看该作者

回复 #2 alexhappy 的帖子

卡的时间很长,不是卡一两秒,是卡住就不动了.几分钟以上. 我用的是

Linux debian.switch.dsm 2.6.18-6-686 #1 SMP Fri Dec 12 16:48:28 UTC 2008 i686 GNU/Linux

论坛徽章:
0
5 [报告]
发表于 2009-04-08 11:19 |只看该作者
那你先这样试试:在每个子线程的第一句加上个Sleep(5);

论坛徽章:
0
6 [报告]
发表于 2009-04-08 11:28 |只看该作者

回复 #5 alexhappy 的帖子

这不能从根本上解决问题.我写个线程池再跑跑吧.

论坛徽章:
0
7 [报告]
发表于 2009-04-08 13:11 |只看该作者

回复 #1 我learnc 的帖子

这段代码一点问题都没有,建议你到同事的机器上,就是换个别的系统,重编一下试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP