linux线程最大数,奇怪,怎么只有300?而且线程是用完就没了,不是同时300啊!

awjx 2007-03-13 03:42:23
程序中有一项任务要工作几分种才结束,为了不阻塞主线程工作,因此我为此任务创建了一个线程,工作完成自动结束!
我保证此任务中单步执行的,也就是说不会存在多个任务同时工作,(每个小时工作一次,此工作要几分钟,所以我开了线程)。
不知大家明白了我的程序意思了没有?

问题是,当创建到第300个任务时,pthread_create返回12。
注:这300个不时同时创建的,而是每个小时他创建一个,几分钟后就结束了,所以不是同时300个线程在运行!

好了,说的够详细了!
怎么会到了第300个小时就出错了呢?

//创建线程的代码如下:
pthread_create(&ht,NULL,CYThr,&index);

...全文
690 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
DanXer 2007-03-16
  • 打赏
  • 举报
回复
"unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己"
我的第一贴的原话
awjx 2007-03-16
  • 打赏
  • 举报
回复
用MFC创建的线程,要设置一个属性bAutoDelete = TRUR告诉系统自动回归线程资源,所以我有次在本版别人的贴子里曾问过:线程函数退出后,是不是完全释放资源了?结果被人耻笑:线程都退出了,还有什么没释放?看来要被耻笑的应该是他!因为他没说在什么情况下才是完全释放资源的。

楼上似乎没说清楚啊,两种状态,倒底是创建时指定的属性还是运行时自动改变这两种属性?本人确实不知,惭愧!
bobya2003 2007-03-15
  • 打赏
  • 举报
回复
oh..yes both are OK
awjx 2007-03-15
  • 打赏
  • 举报
回复
pthread_t tid is not ht , is the new thread created so use pthread_self() in new thread, i think....
---------------
不对吧,
pthread_create(&ht,NULL,CYThr,&index);
pthread_self();

这里的ht就等于pthread_self()吧!
bobya2003 2007-03-15
  • 打赏
  • 举报
回复
int pthread_detach(pthread_t tid) 返回值:函数成功返回0。任何其他返回值都表示错误。

pthread_t tid is not ht , is the new thread created so use pthread_self() in new thread, i think....
awjx 2007-03-15
  • 打赏
  • 举报
回复
到底是这样:
pthread_create(&ht,NULL,CYThr,&index);
pthread_detach(ht);

还是这样:
thread_detach加在线程函数的开始比较好一些
也就是你在的线程函数里的开头加上:
pthread_detach( pthread_self() );


因为加在这两处,看起来效果都是一样的,严格来说是怎样的呢?




DanXer 2007-03-15
  • 打赏
  • 举报
回复
有两个办法可以回答这问题,你好像有点懒,也不动动脑筋:
1.我已经跟你说了“如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。”你的程序现在运行着就不行了,那不就是这种情况:joinable吗?
2.man手册页man pthread_create中的文字
The attr argument can
also be NULL, in which case default attributes are used:
the created thread is joinable (not detached) and has
default (non real-time) scheduling policy
awjx 2007-03-15
  • 打赏
  • 举报
回复
我用默认的属性,即创建线程的第二个参数为NULL
,请问是哪种呢?(joinable,unjoinable).
DanXer 2007-03-15
  • 打赏
  • 举报
回复
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/<pid>/maps文件 ,若看到大概8K左右的很多虚拟内存碎片,基本上可以确认是线程资源泄漏造成的300个线程后pthread_create失败。
xk2y 2007-03-13
  • 打赏
  • 举报
回复
学习````
lurenfu 2007-03-13
  • 打赏
  • 举报
回复
pthread_detach加在线程函数的开始比较好一些
也就是你在的线程函数里的开头加上:
pthread_detach( pthread_self() );
awjx 2007-03-13
  • 打赏
  • 举报
回复
我是用这线程后就让它彻底消失!
下次用的话再重新创建!
我加了pthread_detach(ht);好像没有300的限制了,不知这是不是正确的方法?

sweet_csu 2007-03-13
  • 打赏
  • 举报
回复
如果 是分离线程就不用join来回收,
如果是默认的thread,那么是要用join来联合,回收资源的。
awjx 2007-03-13
  • 打赏
  • 举报
回复
pthread_create(&ht,NULL,CYThr,&index);
pthread_detach(ht);

你是说这样写吗?


bobya2003 2007-03-13
  • 打赏
  • 举报
回复
在程序中调用pthread_join()来回收线程资源
or
在线程开始的时候用pthread_detach()来告诉系统当线程退出的时候由系统来负责回收线程资源

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧