免费注册 查看新帖 |

Chinaunix

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

[C] 创建线程失败,提示 Resource temporarily unavailable,按网上说的方法还是不能解决. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-23 16:00 |只看该作者 |倒序浏览
创建线程失败,提示 Resource temporarily unavailable,按网上说的方法还是不能解决,怎么办?

试了下面两种方法,还是不行。

1.使用ulimit -s 1024*1024命令,将线程栈大小临时设置成1M,经过试验能同时创建2000个线程了。

2.使用pthread_attr_setstacksize在程序中改变线程栈大小。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
2 [报告]
发表于 2013-04-23 16:08 |只看该作者
哥,上代码。

论坛徽章:
0
3 [报告]
发表于 2013-04-23 16:16 |只看该作者
cxytz01 发表于 2013-04-23 16:08
哥,上代码。

上什么代码?创建线程的代码么,代码没问题,少量线程是创建成功了,只是在创建更多线程时出这个错误的。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
4 [报告]
发表于 2013-04-23 16:18 |只看该作者
本帖最后由 cxytz01 于 2013-04-23 16:19 编辑

哦,你说的这个,我遇到过了
Resource temporarily unavailable。

搞线程池的时候,线程一多就这样了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-04-23 16:23 |只看该作者
回复 1# iw1210


   
你可算走到这一步了,主进程预创建线程
创建失败是因为你传错了参数
ulimit -s 后面的数字单位是啥你搞对了没?
pthread_attr_setstacksize传入参数单位你搞对了没?
不看书不看man手册是找不到答案的

还有就是你不是root用户,进一步限制了你的资源(APACHE也不是root用户,人家是怎么搞定上万并发的,你应该看看APACHE是怎么处理这个问题的)

论坛徽章:
0
6 [报告]
发表于 2013-04-23 16:32 |只看该作者
本帖最后由 iw1210 于 2013-04-23 16:35 编辑

回复 5# safedead

不是一有问题不查资料就问,
ulimit -s 后面的数字单位是k
pthread_attr_setstacksize传入参数单位byte

root用户使用ulimit命令设置的 (用su命令切换到root用户执行的)

但还是不行,所以来问了~

论坛徽章:
0
7 [报告]
发表于 2013-04-23 16:33 |只看该作者
cxytz01 发表于 2013-04-23 16:18
哦,你说的这个,我遇到过了
Resource temporarily unavailable。

最后你怎么解决的啊?

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
8 [报告]
发表于 2013-04-23 16:41 |只看该作者
本帖最后由 cxytz01 于 2013-04-23 16:41 编辑

没解决,我好像1w个线程吧,够我用的了,所以就没想法了。

记不清是1w个,还是几千个了。

论坛徽章:
0
9 [报告]
发表于 2013-04-23 16:42 |只看该作者
cxytz01 发表于 2013-04-23 16:41
没解决,我好像1w个线程吧,够我用的了,所以就没想法了。

我现在1000个线程都不到,就出现这个问题了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2013-04-23 16:53 |只看该作者
回复 6# iw1210


按照    ulimit -s 1024来计
栈内存大小是1024K = 1M
记住这个大小不是实际分配栈内存,而是进程的虚拟栈空间大小
32位LINUX是3+1模型,3是用户态虚拟地址空间是3G,1是内核态地址空间是1G
理论上单进程可以创建3G / 1M = 3072个线程
如果主机上已有很多其它进程和线程,你能创建的线程就比3072少

你前面可是写的ulimit -s 1024 * 1024
我姑且认为你这是笔误

默认设置下,32位LINUX的ulimit -s大小为10240,即10MB,单进程创建线程上限大约260个
改成1024可以上2000线程,但我估计你的程序会出问题,特别是你在用C++然后乱用临时对象,1MB的栈内存恐怕不够用!
常用ulimit -s 4096是下限,已知小于4096会导致PHP4.x无法使用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP