+ -
当前位置:首页 → 问答吧 → c语言的线程死了如何才能不影响进程?

c语言的线程死了如何才能不影响进程?

时间:2010-07-26

来源:互联网

我用
  1. if(pthread_create(&tid,&attr,(void *)wartime,arg))
  2.          {
  3.                   perror("error wartime");
  4.          }
  5.          printf("启动wartime线程%d\n",tid);
复制代码
启动一个线程,结果这个线程死了,进程也就跟着挂了,怎么才能做到这个线程死了,进程依然活着呢?(我一个进程有好几个线程)

作者: jd808   发布时间: 2010-07-26

这个没办法,线程在进程的空间的执行,线程死了,进程也跟着完蛋!

不然就回归多进程吧

作者: folklore   发布时间: 2010-07-26

本帖最后由 davelv 于 2010-07-26 14:43 编辑

只要线程不调用exit()这样的整体退出函数,进程就不会挂。
如果是防止默认线程由于没有任务可做而返回的话。可以自己写一个函数join到剩余其他线程里。
顺便说一下,这个死是退出的意思,还是死锁的意思?
以上说的是退出情况。
判断死锁的话,可以自己注册alarm信号,对线程进行超时判断。

作者: davelv   发布时间: 2010-07-26

多线程就有这个弊端
找到挂掉的原因,  解决掉就行了呗.

作者: teng0210   发布时间: 2010-07-26

挂掉的原因一下子找不到,是意外死的,不是可遇见死的,唉~~~
我最莫名其妙的是 ,一个函数里,接受一个参数a(整形),并打印出来是正常的,中间执行一个函数之后在打印出来a值,发现a值不对了
比如
void aa(int c)
{
   printf(“%i”,c); 这里正确
  tttt(at);
  printf("%i",c);//这里值就变了,一直找不到原因
}

作者: jd808   发布时间: 2010-07-26

这说明你的这个函数不是线程安全的,并且有错误。

作者: langue   发布时间: 2010-07-26

内存有越界的地方

作者: hellioncu   发布时间: 2010-07-26

回复 langue
估计是哪里的错误,把函数栈给改写了。

作者: davelv   发布时间: 2010-07-26

线程崩溃了,整个进程也要崩溃的。。。

作者: rain_fish   发布时间: 2010-07-26

原来楼主说的死,不是死锁,是崩溃的意思。。

作者: davelv   发布时间: 2010-07-26

  1. //通用读取mem数据
  2. void menget(memcached_st * memc,memcached_return rc,char* getkey,char*runinfo)
  3. {
  4.     char return_key[MAXDATASIZE];
  5.     size_t return_key_length;
  6.     char * return_value;
  7.     size_t return_value_length;
  8.     char* keys[]= {getkey};//用户user
  9.     size_t key_length[]= {strlen(getkey)};
  10.     uint32_t flags;
  11.    
  12.     rc = memcached_mget(memc, keys, key_length, 1);
  13.    
  14.     return_value = memcached_fetch(memc, return_key, &return_key_length, &return_value_length, &flags, &rc);
  15.    
  16.     if (rc == MEMCACHED_SUCCESS)
  17.     {
  18.         if(!return_value)
  19.         {
  20.             //memcached_free(memc);
  21.             strcpy(runinfo,"0");
  22.             return;
  23.         }
  24.         //解决转义问题
  25.         return_value=strreplace(return_value,"\\\"","\"");
  26.         return_value=strreplace(return_value,"\"{","{");
  27.         return_value=strreplace(return_value,"}\"","}");
  28.         strcpy(runinfo,return_value);
  29.     }else{
  30.         strcpy(runinfo,"0");
  31.     }
  32.     //memcached_free(memc);
  33. }
复制代码
我没看出这个程序有哪里改了那个c参数的值,在说那个c不是整形么?如果是指针到好理解,有肯那个是被改了,可整形怎么改?1没传递这个参数,2 就连这个函数里面都没c这个变量,所以就非常郁闷啊

作者: jd808   发布时间: 2010-07-26

c是什么类型没关系,例如runinfo空间不足就会越界,可能改变了c的值

作者: hellioncu   发布时间: 2010-07-26

哦 原来这样啊 郁闷啊

作者: jd808   发布时间: 2010-07-26

如果在函数内部使用外部buffer,前提是外部提供足够的空间,且最好函数内部设定最大范围值。

作者: mirnshi   发布时间: 2010-07-26

也可能被其它线程给改了! 注意线程安全。必要是加锁!

作者: zhangsuozhu   发布时间: 2010-07-26

相关阅读 更多