关于线程创建的疑惑??????????

chinalongship 2008-09-23 05:20:16
为说明主要问题,简单写出主要代码

-----------------------------服务器端
void* ThreadProc(void * Param);


int main(int argc, char* argv[])
{
socket()
bind()
listen()
while (1)
{
int client_socket = accept(..);
pthread_t thrd;
pthread_create(&thrd,NULL,ThreadProc,(void *)&client_socket)
}
}

void* ThreadProc(void * Param)
{
...
return NULL;
}

客户端不停的连接服务器端,服务器端创建一定数量的线程后,pthread_create()就失败。这个可能是因为系统资源有限。但是线程执行的
任务非常有限,几乎会立刻返回,如果等待很长的时间后,再次连接服务器端,此时线程仍然创建失败,这个时候系统的资源应该早已被释放了,为什么依然创失败呢?


...全文
91 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
realdragon2 2008-09-23
  • 打赏
  • 举报
回复
detach or pthread_join 一下.

btw: 答案都这么多了啊,呵呵.
hly930 2008-09-23
  • 打赏
  • 举报
回复
study
leeyiqun 2008-09-23
  • 打赏
  • 举报
回复
线程分为“可联合的”(默认)和“可分离的”。可联合的线程终止后,系统将保留其线程ID和退出状态直到另一个线程调用 pthread_join()函数。与之相反,可分离的线程退出后,系统将释放其所有资源,其他线程也无法等待其终止。
估计你是没有调用 pthread_detach()函数将线程设置为“可分离的”。
建议这样写试试:

pthread_t thrd;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&thrd,&attr,ThreadProc,(void *)&client_socket)
快乐田伯光 2008-09-23
  • 打赏
  • 举报
回复
看线程库的实现吧,LinuxThread在内核里就是一个进程,没有join的话就相当于zombie进程的.

[Quote=引用 8 楼 sucker2000 的回复:]
引用 7 楼 jy00923702 的回复:
线程用过之后需要用detach()释放,或者pthread_join()等待结束之后回收资源,否则即使线程返回也不会结束,并形成僵尸进程(zombie),这样资源是不会回收的!zombie多了之后再创建线程自然会失败!


这哪和那啊?zombie特指进程fork后没有wait导致的问题,什么时候和线程冉上了?最多算是类比。不要误人子弟啊
[/Quote]
sucker2000 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jy00923702 的回复:]
线程用过之后需要用detach()释放,或者pthread_join()等待结束之后回收资源,否则即使线程返回也不会结束,并形成僵尸进程(zombie),这样资源是不会回收的!zombie多了之后再创建线程自然会失败!
[/Quote]

这哪和那啊?zombie特指进程fork后没有wait导致的问题,什么时候和线程冉上了?最多算是类比。不要误人子弟啊
jy00923702 2008-09-23
  • 打赏
  • 举报
回复
线程用过之后需要用detach()释放,或者pthread_join()等待结束之后回收资源,否则即使线程返回也不会结束,并形成僵尸进程(zombie),这样资源是不会回收的!zombie多了之后再创建线程自然会失败!
love_aiqiu_123 2008-09-23
  • 打赏
  • 举报
回复
学之不精,学习!

为什么呢?
独立线程,datached thread

估计是没有detatch,并且主线程也没有用pthread_join来回收资源!
要么detatch,要么在主线程中用pthrad_join等待子线程结束,回收系统资源;

Good Luck!
4楼的应该有道理!

guoli0813 2008-09-23
  • 打赏
  • 举报
回复
跟贴,学习
bshawk 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guosha 的回复:]
线程detach了吗?
[/Quote]
估计是没有detatch,并且主线程也没有用pthread_join来回收资源!
要么detatch,要么在主线程中用pthrad_join等待子线程结束,回收系统资源;

Good Luck!
tjac00260 2008-09-23
  • 打赏
  • 举报
回复
我也遇到过这个问题,一般主进程创建了线程之后不会马上执行线程的,而且系统默认的进程栈空间
好像是2-3m,这个我没有确认过,所以你在线程没有执行完之前就把系统资源用完了。
快乐田伯光 2008-09-23
  • 打赏
  • 举报
回复
线程detach了吗?
chinalongship 2008-09-23
  • 打赏
  • 举报
回复
期待高手的解决

23,120

社区成员

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

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