pthread_create创建线程后是否需要释放资源
结论
Linux下pthread_create创建线程后,必须手动设定资源释放,不然资源占用达到上限后,后续pthread_create创建线程会失败。(问题容易出现在频繁创建线程的场景中)
pthread_create资源释放的三种方法:
//方法一
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&pid, &attr, __task, NULL); //方法二
pthread_detach(pid);
pthread_detach(pthread_self());//方法三 阻塞等待线程退出(线程内部必须有退出的变量等标识)
pthread_join(pid, NULL);
pthread_create返回11解决方法
https://blog.csdn.net/cry1994/article/details/52649520
实例:测试线程创建上限、只创建、线程不退出。
结果:创建251个线程后,后面创建会失败,返回值11,errno:12
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h> // for gettimeofday#define debugMsg(fmt, arg...)\do{\unsigned long lSec = 0; unsigned long lUSec = 0;\getTimeuSec(&lSec, &lUSec);\printf("[%ld.%06ld]:", lSec, lUSec);\printf(fmt, ##arg);\}while(0)int getTimeuSec(unsigned long *lSec, unsigned long *lUSec)
{struct timeval start;gettimeofday( &start, NULL );*lSec = start.tv_sec;*lUSec = start.tv_usec;return 0;
}
void * doPrint(void *arg)
{int i = 0;while(1){debugMsg("pthread %lu; main %d\n", pthread_self(), *(int*)arg);usleep(1000000);}return NULL;
}int test_while(int num)
{ pthread_t pid;int ret = pthread_create(&pid, NULL, doPrint, &num);printf("test_while num:%d, ret:%d errno:%d\n",num,ret,errno);return 0;
}int main()
{int i = 0;while(1){i++;test_while(i);usleep(10);}return 0;
}
实例:测试线程创建上限、创建后线程自动退出
结果:创建251个线程后,后面创建会失败,返回值11,errno:12
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h> // for gettimeofday#define debugMsg(fmt, arg...)\do{\unsigned long lSec = 0; unsigned long lUSec = 0;\getTimeuSec(&lSec, &lUSec);\printf("[%ld.%06ld]:", lSec, lUSec);\printf(fmt, ##arg);\}while(0)int getTimeuSec(unsigned long *lSec, unsigned long *lUSec)
{struct timeval start;gettimeofday( &start, NULL );*lSec = start.tv_sec;*lUSec = start.tv_usec;return 0;
}
void * doPrint(void *arg)
{int param = *(int*)arg;while(1){debugMsg("pthread %lu; main %d\n", pthread_self(), param);break;}debugMsg("pthread %lu return.\n", pthread_self());return NULL;
}int test_while(int param)
{ pthread_t pid;int num = param;int ret = pthread_create(&pid, NULL, doPrint, &num);printf("test_while num:%d, ret:%d errno:%d\n",num,ret,errno);return 0;
}int main()
{int i = 0;while(1){i++;test_while(i);usleep(10);}return 0;
}
实例3:测试线程创建上限、创建后线程自动退出
结果:线程可一直创建成功、线程ID会重复出现
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h> // for gettimeofday#define debugMsg(fmt, arg...)\do{\unsigned long lSec = 0; unsigned long lUSec = 0;\getTimeuSec(&lSec, &lUSec);\printf("[%ld.%06ld]:", lSec, lUSec);\printf(fmt, ##arg);\}while(0)int getTimeuSec(unsigned long *lSec, unsigned long *lUSec)
{struct timeval start;gettimeofday( &start, NULL );*lSec = start.tv_sec;*lUSec = start.tv_usec;return 0;
}
void * doPrint(void *arg)
{int param = *(int*)arg;while(1){debugMsg("pthread %lu; main %d\n", pthread_self(), param);break;}debugMsg("pthread %lu return.\n", pthread_self());pthread_detach(pthread_self());return NULL;
}int test_while(int param)
{ pthread_t pid;int num = param;int ret = pthread_create(&pid, NULL, doPrint, &num);printf("test_while num:%d, ret:%d errno:%d\n",num,ret,errno);return 0;
}int main()
{int i = 0;while(1){i++;test_while(i);usleep(10);}return 0;
}
避免僵尸线程:线程资源的回收与join、detach
https://blog.csdn.net/bobbypollo/article/details/79891451
//方法一
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&pid, &attr, __task, NULL); //方法二
pthread_detach(pid);
pthread_detach(pthread_self());//方法三 阻塞等待线程退出(线程内部必须有退出的变量等标识)
pthread_join(pid, NULL);
Pthread创建线程后必须使用join或detach释放线程资源
https://blog.csdn.net/github_27263697/article/details/78934061
http://blog.sina.com.cn/s/blog_6531fb2201013jd5.html
Pthread使用总结
https://blog.csdn.net/liujiabin076/article/details/53456962
Linux多线程操作pthread_t
https://blog.csdn.net/sevens_0804/article/details/102823184
pthread_create创建线程后是否需要释放资源相关推荐
- clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结(转)
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
- Pthread创建线程后必须使用join或detach释放线程资源
这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthread_detach): Either pthread_join(3) or pthread_detach() should ...
- 创建线程后为什么马上调用CloseHandle()来关闭句柄
hThread = CreateThread( NULL, 0, ThreadFunc, NULL, 0, &dwThreadId); CloseHandle(hThread); 如上面这样的 ...
- OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的过程就是这些数 ...
- pthread_create()创建线程最大个数
线程应用程序最常见导致创建线程失败的原因是线程栈大小的设置.创建一个新的线程,默认情况下系统为线程栈预留了2MB的寻址空间.线程栈起始于进程虚拟 内存的高端地址,并向虚拟内存底端地址方向扩展.取决于线 ...
- clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
- pthread_create创建线程失败,返回11: Resource temporarily unavailable
一.问题背景 在重启一个程序时死活启动不起来,后发现程序中在使用pthread_create函数创建线程时失败,返回值11,即Resource temporarily unavailable. 二.问 ...
- linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结
1.介绍API 1.pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...
- pthread_create创建线程
什么是线程? 轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程. 进程:拥有独立的地址空间,拥有PCB,相当于独居. 线程:有PCB,但没有独立的 ...
- 关于创建线程后CPU使用率100%的问题
之前在做项目的时候,写了一个关于多线程的,调试的时候发现运行时CPU占用率100,当时考虑的是线程重复的做某一件事情,所以主程序main不能退出,用了while(1),循环,那么问题就出在了这个whi ...
最新文章
- 人类首次登月50年后,这60家公司决心重返月球
- iOS 高效开发-----实现description 方法 (续)
- linux中关于wifi函数,wifi详解(五)
- matlab中的cellstr的用法,matlab中的cell array, cellstr()和char()的用法
- chapter 15 运算符详解
- 显存文本模式详解 ———《x86汇编语言:从实模式到保护模式》读书笔记补遗02
- PowerDesigner中的对象与关系映射建模
- 自动生成四则运算题目
- python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例
- java画笔覆盖在界面_Java画笔的简单实用方法
- 移动项目工作笔记0001---使用uni-app开发移动端应用
- 让Cookies操作变得向Session一样简单
- 【优化分配】基于matlab粒子群算法求解火车票分配优化问题【含Matlab源码 1137期】
- selenium万能选择器
- 博科 5300 光纤交换机配置 备份和恢复
- python物性库能调用哪些物质_用于水和水蒸汽物性计算的Python模块——iapws
- Final Cut Pro X for Mac(FCPX专业视频剪辑软件) v10.4.6中文特别版
- BAT命令常用API
- Linux下的触摸屏驱动
- bak文件转换成sql文件_将BAK文件还原到SQL数据库!
热门文章
- 在线电脑内存测试软件,Everest/PC Mark内存基准测试_金士顿 8GB DDR3 1600_内存硬盘-中关村在线...
- C语言连连看秒杀辅助
- 湖南职称计算机英语,湖南职称计算机考试哪里考,A,B,C,D各级别是怎么划分的...
- 6月29日Java实训第一天
- apk改之理 java源码_ApkIDE改之理最新版+环境包下载
- RainMeter学习2
- vlc 网页插件的 使用与控制 API
- tbpbebzbyb英文_化工常用英文缩写
- [ 服务器 ] ___ Linux : Tftpd
- SQL语法——触发器