linux 线程创建后需要释放

linux 线程创建后需要释放

个人经历: 在写嵌入式LINUX 应用时用到线程,使用pthread_cread创建线程,但在第252次创建时,发现线程并没有执行,经过一翻DEBUG后,发现pthread_cread()返回错误码

11,创建线程失败。在度娘一下这个错误码11

 

下面引用来自帖子的解释:https://blog.csdn.net/cry1994/article/details/52649520

不同的机器上最终计数不同,但是结果应该是一样的。
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,则该线程运行结束后会自动释放所有资源。
————————————————
版权声明:本文为CSDN博主「Lonely丶静默」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cry1994/java/article/details/52649520

 

 

结束:

最终我在我的执行线程的最后一个语句为:pthread_detach(pthread_self()) ;便解决了前文所述BUG,现在线程可以无限创建并执行

 

posted on 2020-06-15 17:58  一个大菜B  阅读(1020)  评论(1编辑  收藏  举报