linux 多线程 pthread_create返回11,pthread_create返回11解决方法
pthread_create返回11解决方法
pthread_create返回11解决方法
pthread_create 返回11 说明资源不可用。通常是线程资源没有释放导致的。
用ulimit -a 可以查看系统线程最大数。
原因
pthread有两种状态joinable状态和unjoinable状态,默认的状态是joinable。这种状态下不会自己释放。
解决
线程执行完毕添加 pthread_detach(pthread_self()) 函数。
以下是原文
pthread_create返回11解决方法
https://blog.csdn.net/cry1994/article/details/52649520
一直以为,程序创建线程,线程运行结束会自动清空资源
最近在一个项目中用到了线程,除去业务逻辑,我把他简化出来是下面这样
//pthread.c 错误demo示例
#include
#include
static int testcount = 0;
static void *test_thread_handler()
{
testcount++;
printf("%d\n",testcount);
return 0;
}
int main( int argc, char *argv[] )
{
int ret = 0;
pthread_t test_tid;
while(1)
{
usleep(10000);
ret = pthread_create(&test_tid, NULL, test_thread_handler,NULL);
if(ret != 0)
{
printf("Create handler error :%d!\t testcount:%d\n", ret, testcount);
return -1;
}
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
备注:pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在线程函数在编译时,需要连接库函数
gcc pthread.c -o pthread -lpthread
运行结果如下
不同的机器上最终计数不同,但是结果应该是一样的。
pthread_create()返回11的错误码表示Resource temporarily unavailable
资源暂时不可用,按理说线程return 0后资源应该自动释放,同时我使用free查看发现内存也是足够的。
经过多方面查找资料,得知linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,默认的状态是joinable。
如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多),它的状态类似于进程中的Zombie Process(僵尸进程)。只有当调用了pthread_join之后这些资源才会被释放。
若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
但是调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,如果不需要阻塞的情况下,这时可以在子线程中加入代码
pthread_detach(pthread_self())
或者父线程调用
pthread_detach(test_tid)(非阻塞,可立即返回)
这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。
最终程序如下:
//pthread.c 修复错误demo后示例
#include
#include
static int testcount = 0;
static void *test_thread_handler()
{
pthread_detach(pthread_self());
testcount++;
printf("%d\n",testcount);
pthread_exit(0);
return 0;
}
int main( int argc, char *argv[] )
{
pthread_t test_tid;
int ret = 0;
while(1)
{
usleep(10000);
ret = pthread_create(&test_tid, NULL, test_thread_handler,NULL);
if(ret != 0)
{
printf("Create handler error :%d!\t testcount:%d\n", ret, testcount);
return -1;
}
}
return 0;
}
pthread_create返回11解决方法相关教程
linux 多线程 pthread_create返回11,pthread_create返回11解决方法相关推荐
- Ubuntu18.04配置carla0.9.11踩坑与解决方法总结,同时解决安装carla-ros-bridge遇到的问题,并复现OpenCDA成功与ros关联
Ubuntu18.04配置carla0.9.11踩坑与解决方法总结,同时解决安装carla-ros-bridge遇到的问题,并复现OpenCDA成功与ros关联 背景: 主要是为了复现叶小飞的Open ...
- WORD Application.Documents.Open函数返回null的一种解决方法
WORD Application.Documents.Open函数返回null的一种解决方法 参考文章: (1)WORD Application.Documents.Open函数返回null的一种解决 ...
- C#爬网页时“远程服务器返回错误: (403) 已禁止”解决方法
C#爬网页时"远程服务器返回错误: (403) 已禁止"解决方法 参考文章: (1)C#爬网页时"远程服务器返回错误: (403) 已禁止"解决方法 (2)ht ...
- JavaScript监听手机物理返回键的两种解决方法
JavaScript监听手机物理返回键的两种解决方法 参考文章: (1)JavaScript监听手机物理返回键的两种解决方法 (2)https://www.cnblogs.com/xzzzys/p/8 ...
- scrapy爬虫返回302,301,解决方法
scrapy爬虫返回302,301,解决方法 参考文章: (1)scrapy爬虫返回302,301,解决方法 (2)https://www.cnblogs.com/s5vc/p/10437242.ht ...
- PADS 在 Windows 11 下闪退解决方法
PADS 在 Windows 11 下闪退解决方法 Windows 11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备, 于2021年6月24日发布,2021年10 ...
- SQL Server:偏移量为 0x0000000009c000 的位置执行 读取 期间,操作系统已经向 SQL Server 返回了错误 21的解决方法
SQL Server:偏移量为 0x0000000009c000 的位置执行 读取 期间,操作系统已经向 SQL Server 返回了错误 21的解决方法 问题描述: 严重: Servlet.serv ...
- 天地劫一直说服务器在维护,天地劫幽城再临3月11日登录失败怎么办?3.11服务器连接失败解决方法[多图]...
天地劫幽城再临3月11日登录失败怎么办?相信很多玩家对于这个登录失败还不知道怎么解决,下面就让11773小编为大家带来,天地劫幽城再临3.11服务器连接失败解决方法. 天地劫幽城再临3月11日登录失败 ...
- 天地劫一直说服务器在维护,《天地劫幽城再临》3.11服务器连接失败解决方法 3月11日登录失败如何解决...
天地劫幽城再临3月11日登录失败怎么办?相信很多玩家对于这个登录失败还不知道怎么解决,下面就让九游小编为大家带来,天地劫幽城再临3.11服务器连接失败解决方法. 天地劫幽城再临3月11日登录失败怎么办 ...
- springboot返回大写变小写的解决方法
springboot返回大写变小写的解决方法 参考文章: (1)springboot返回大写变小写的解决方法 (2)https://www.cnblogs.com/woainixxx/p/113675 ...
最新文章
- ML之FE:对pandas的dataframe中的类别型字段进行数字编码化(类别型特征数值化)并导出映射表daiding
- hdu 6579 Operation (在线线性基)
- Photoshop CS5完全自学实战实例视频教程
- [其它] - 为什么中国的程序员技术偏低
- windowoPhone7.1 Socket编程-实现手机与电脑通信
- 一个七年的老测试给想入行软件测试这个行业的二十条建议
- win10卸载db2_如何在Linux下干净卸载db2数据库
- java中的文件操作:读取写入byte[]字节流、string字符串、list列表
- Codeforces Round #388 (Div. 2) C. Voting
- 分享一套基于HTML5的网络拓扑图组件 Qunee下载
- Mysql主从同步及主从同步延迟解决方案
- 十本数据结构与算法书籍推荐
- 数字选择器NumberPicker使用教程
- 如何通过QQ群做网站推广
- 笔记本CPU更换硅脂、液金散热对比测试
- PDF文件可以修改吗,怎么修改PDF文件内容
- UVA10635--Prince and Princess
- Mysql如何添加环境变量(详细教程)
- 常见的鼠标事件以及onmouseover与onmousemove的区别
- 重新编译 vcl70.bpl
热门文章
- hadoop之安全模式,HDFS的读取,写入
- c#(asp.net/core)杂谈笔记
- 微信小程序手动获取自己位置wx.chooseLocation
- 「轻阅读」如何设计全链路99.99%高可用架构?
- winform通过restsharp调用api接口登录及其它接口
- Linux下从零搭建WordPress
- Windows下python安装pymyssql报错
- oracle归档日志满正常么,oracle归档日志满了的处理方法
- 全网首发:制作LINUX安装软件包,要处理哪些系统目录和文件(1)
- 在MAC系统上,重新编译了一次OpenJDK8