pthread_create中Resource temporarily unavailable问题

设备上程序因pthread_create失败而启动异常,错误代码11表明资源暂时不可用。并非内存不足,而是线程限制问题。通过对比发现,线程数受stack size影响,设备默认限制导致最多创建115个线程。调整参数后,启动恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有台设备发现程序启动失败,上去通过日志发现是线程启动(pthread_create)失败,进一步定位,打印errno:11,Resource temporarily unavailable。

但是发现失败前不管是top还是free,还是swap虚拟内存都不高,不存在内存不足的问题。

百度发现说是ulimit给的线程数量不足。

ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 257733
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 30000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) 1200000
file locks                      (-x) unlimited

进程1024个完全足够,出于实验目的,修改为更大的数字,但是发现进程只能启动几十个线程,尝试修改其他参数,发现最多只能启动115个线程。

只好和其他设备进行对比,发现其他设备的信息是
virtual memory (kbytes, -v) unlimited
于是进行修改,发现启动正常。

查了下资源,线程占用的虚拟内存很高,但是实际上并不使用,只是计算一个预计的大小,所以swap依然会是0
一个线程占用的虚拟内存是根据stack size来设置的,这个设备刚好是10240,1200000/10240=117.18,所以启动了115个线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值