结论

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创建线程后是否需要释放资源相关推荐

  1. clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  2. Pthread创建线程后必须使用join或detach释放线程资源

    这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthread_detach): Either pthread_join(3) or pthread_detach() should ...

  3. 创建线程后为什么马上调用CloseHandle()来关闭句柄

    hThread = CreateThread( NULL, 0, ThreadFunc, NULL, 0, &dwThreadId); CloseHandle(hThread); 如上面这样的 ...

  4. OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的过程就是这些数 ...

  5. pthread_create()创建线程最大个数

    线程应用程序最常见导致创建线程失败的原因是线程栈大小的设置.创建一个新的线程,默认情况下系统为线程栈预留了2MB的寻址空间.线程栈起始于进程虚拟 内存的高端地址,并向虚拟内存底端地址方向扩展.取决于线 ...

  6. clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  7. pthread_create创建线程失败,返回11: Resource temporarily unavailable

    一.问题背景 在重启一个程序时死活启动不起来,后发现程序中在使用pthread_create函数创建线程时失败,返回值11,即Resource temporarily unavailable. 二.问 ...

  8. linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结

    1.介绍API 1.pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...

  9. pthread_create创建线程

    什么是线程? 轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程. 进程:拥有独立的地址空间,拥有PCB,相当于独居. 线程:有PCB,但没有独立的 ...

  10. 关于创建线程后CPU使用率100%的问题

    之前在做项目的时候,写了一个关于多线程的,调试的时候发现运行时CPU占用率100,当时考虑的是线程重复的做某一件事情,所以主程序main不能退出,用了while(1),循环,那么问题就出在了这个whi ...

最新文章

  1. 人类首次登月50年后,这60家公司决心重返月球
  2. iOS 高效开发-----实现description 方法 (续)
  3. linux中关于wifi函数,wifi详解(五)
  4. matlab中的cellstr的用法,matlab中的cell array, cellstr()和char()的用法
  5. chapter 15 运算符详解
  6. 显存文本模式详解 ———《x86汇编语言:从实模式到保护模式》读书笔记补遗02
  7. PowerDesigner中的对象与关系映射建模
  8. 自动生成四则运算题目
  9. python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例
  10. java画笔覆盖在界面_Java画笔的简单实用方法
  11. 移动项目工作笔记0001---使用uni-app开发移动端应用
  12. 让Cookies操作变得向Session一样简单
  13. 【优化分配】基于matlab粒子群算法求解火车票分配优化问题【含Matlab源码 1137期】
  14. selenium万能选择器
  15. 博科 5300 光纤交换机配置 备份和恢复
  16. python物性库能调用哪些物质_用于水和水蒸汽物性计算的Python模块——iapws
  17. Final Cut Pro X for Mac(FCPX专业视频剪辑软件) v10.4.6中文特别版
  18. BAT命令常用API
  19. Linux下的触摸屏驱动
  20. bak文件转换成sql文件_将BAK文件还原到SQL数据库!

热门文章

  1. 在线电脑内存测试软件,Everest/PC Mark内存基准测试_金士顿 8GB DDR3 1600_内存硬盘-中关村在线...
  2. C语言连连看秒杀辅助
  3. 湖南职称计算机英语,湖南职称计算机考试哪里考,A,B,C,D各级别是怎么划分的...
  4. 6月29日Java实训第一天
  5. apk改之理 java源码_ApkIDE改之理最新版+环境包下载
  6. RainMeter学习2
  7. vlc 网页插件的 使用与控制 API
  8. tbpbebzbyb英文_化工常用英文缩写
  9. [ 服务器 ] ___ Linux : Tftpd
  10. SQL语法——触发器