当前位置: 技术问答>linux和unix
linux线程最大数,奇怪,怎么只有300?而且线程是用完就没了,不是同时300啊!
来源: 互联网 发布时间:2016-01-13
本文导语: 程序中有一项任务要工作几分种才结束,为了不阻塞主线程工作,因此我为此任务创建了一个线程,工作完成自动结束! 我保证此任务中单步执行的,也就是说不会存在多个任务同时工作,(每个小时工作一次,此...
程序中有一项任务要工作几分种才结束,为了不阻塞主线程工作,因此我为此任务创建了一个线程,工作完成自动结束!
我保证此任务中单步执行的,也就是说不会存在多个任务同时工作,(每个小时工作一次,此工作要几分钟,所以我开了线程)。
不知大家明白了我的程序意思了没有?
问题是,当创建到第300个任务时,pthread_create返回12。
注:这300个不时同时创建的,而是每个小时他创建一个,几分钟后就结束了,所以不是同时300个线程在运行!
好了,说的够详细了!
怎么会到了第300个小时就出错了呢?
//创建线程的代码如下:
pthread_create(&ht,NULL,CYThr,&index);
我保证此任务中单步执行的,也就是说不会存在多个任务同时工作,(每个小时工作一次,此工作要几分钟,所以我开了线程)。
不知大家明白了我的程序意思了没有?
问题是,当创建到第300个任务时,pthread_create返回12。
注:这300个不时同时创建的,而是每个小时他创建一个,几分钟后就结束了,所以不是同时300个线程在运行!
好了,说的够详细了!
怎么会到了第300个小时就出错了呢?
//创建线程的代码如下:
pthread_create(&ht,NULL,CYThr,&index);
|
linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,
如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。
若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己,如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为joinable,然后适时调用pthread_join.
在程序运行中检查/proc//maps文件 ,若看到大概8K左右的很多虚拟内存碎片,基本上可以确认是线程资源泄漏造成的300个线程后pthread_create失败。
如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。
若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己,如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为joinable,然后适时调用pthread_join.
在程序运行中检查/proc//maps文件 ,若看到大概8K左右的很多虚拟内存碎片,基本上可以确认是线程资源泄漏造成的300个线程后pthread_create失败。
|
在程序中调用pthread_join()来回收线程资源
or
在线程开始的时候用pthread_detach()来告诉系统当线程退出的时候由系统来负责回收线程资源
or
在线程开始的时候用pthread_detach()来告诉系统当线程退出的时候由系统来负责回收线程资源
|
pthread_detach加在线程函数的开始比较好一些
也就是你在的线程函数里的开头加上:
pthread_detach( pthread_self() );
也就是你在的线程函数里的开头加上:
pthread_detach( pthread_self() );