免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sevendays
打印 上一主题 下一主题

求助 c/c++ 线程编程问题(linux下) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-12-12 16:27 |只看该作者

回复 9楼 kukoo 的帖子

呵呵,找你这样确实没问题,可为什么我用pmap看的就一直是那么多呢?难道pmap有问题?我也cat一下进程文件看看

谢谢

论坛徽章:
0
12 [报告]
发表于 2005-12-12 16:34 |只看该作者

回复 9楼 kukoo 的帖子

pmap没有问题,难道是系统问题?
这是我cat出来的状态
Name:   pthreadtest2.ex
State:  S (sleeping)
Tgid:   14883
Pid:    14883
PPid:   12949
TracerPid:      0
Uid:    500     500     500     500
Gid:    500     500     500     500
FDSize: 256
Groups: 500
VmSize:     6380 kB
VmLck:         0 kB
VmRSS:       852 kB
VmData:     4148 kB
VmStk:         8 kB
VmExe:         4 kB
VmLib:      2168 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 8000000000000000
SigCgt: 0000000080000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
一直都没减少过,唉!

论坛徽章:
0
13 [报告]
发表于 2005-12-19 16:08 |只看该作者

问题基本上已经解决,gcc所带的线程库问题,继续测试中,谢谢大家

问题基本上已经解决,gcc所带的线程库问题,继续测试中,谢谢大家

论坛徽章:
0
14 [报告]
发表于 2005-12-19 21:58 |只看该作者
LZ能否说说, 线程库有什么问题? 哪个版本的libpthread. 用什么方法测试?
谢谢.

论坛徽章:
0
15 [报告]
发表于 2005-12-20 09:58 |只看该作者

大概如下

我这环境是linux 2.4(redhat) + gcc3.2.2
目前还没有正式结果,但测试到的现象如下
1> 对于子线程内使用的栈空间,如果不在创建子线程之前申请好,并且自己管理,那么在子线程pthread_exit和pthread_join调用之后,系统默认的子线程栈还是同样没有释放(可能是要等到整个进程退出之后,管理线程才回收)
2> 对于子线程内部的堆空间,比如string类对象,如果不在改对象销毁之前显式调用~string()函数,那么堆空间也不会释放
3> 不用pthread_exit退出线程,用return 的话,效果好一点,但没有仔细测试。
基于这上面的三点,我都不愿意再测试了,准备升级gcc再来看看,我的pm说是linux缓存机制问题,但是具体都没有去测试查资料,所以我准备一个个排查。我刚进这公司不久,手上只有一个测试机,升级gcc得请示上面...大家如果测试过的,把gcc版本linux版本贴出来,我估计就是线程的实现问题

论坛徽章:
0
16 [报告]
发表于 2005-12-20 10:29 |只看该作者
原帖由 sevendays 于 2005-12-20 09:58 发表
我这环境是linux 2.4(redhat) + gcc3.2.2
目前还没有正式结果,但测试到的现象如下
1> 对于子线程内使用的栈空间,如果不在创建子线程之前申请好,并且自己管理,那么在子线程pthread_exit和pthread_join调用 ...

我认为,你没有证据说线程库有问题. 你的测试程库就说明了这点.

(1) 你的PM说得对, 子线程内使用的栈空间是缓存的.

(2) 子线程没有内部的堆空间, 所有的堆上的东西都是进程的. 所有线程共享. string不需要显式调用~string()函数来释放其使用的堆空间.

(3) pthread_exit和return对你没区别.

升级gcc不会有改变, 建仪找找别的原因.

论坛徽章:
0
17 [报告]
发表于 2005-12-20 15:48 |只看该作者

回复 16楼 Alligator27 的帖子

1〉第一条 linux缓存机制只查到比较笼统的原理,这个我没有深入去了解
2〉第二条 我在函数内部string 对象的堆是在进程上的,所以如果不显式释放,也就说要等到进程结束才释放
3〉return 和 pthread_exit 是一样,但我不理解这个测试结果
  如果调用return,但对里面的string对象不调用~string(),那么内存正常
  如果调用pthread_exit(NULL),但对里面的string调用~string 那么内存正常
  如果调用pthread_exit(NULL),但不掉用~string(),那么每次循环都会吃掉我给string里面的1M左右的空间

当然,这在进程结束的时候能释放,但为什么会这样?如果你给出权威资料以及测试结果,我信

从你的回贴我要鄙视所谓的牛人们,经验是比我丰富,知识面和深度是比我强,你泛泛而谈,自以为是的建议,为什么我就不能怀疑gcc版本太低,你这样测试过?你就敢这么肯定?

论坛徽章:
0
18 [报告]
发表于 2005-12-20 17:13 |只看该作者
to 楼上:

2〉第二条 我在函数内部string 对象的堆是在进程上的,所以如果不显式释放,也就说要等到进程结束才释放

是谁告诉你函数内部的string对象是在进程堆里面创建的?

只要你不是用new delete分配和释放string对象并且只要它不是一个静态对象,那么它就是基于堆栈的。希望你把heap和stack两个概念区分清楚;

当你使用new和delete进行对象分配时,是在堆内为对象分配内存。比如这样
string* helloStr = new string("hello");
...
delete helloStr;
进程内所有线程共享其所属进程的堆资源。

当你在线程函数里使用
string helloStr = "hello";时,"hello"这个字符串被分配在进程的常量数据区内。
而helloStr则被分配在线程的堆栈上,编译器会产生调用形如string(const char* str)形式的构造函数的代码,helloStr对象的data数据成员被初始化为一个在堆内动态分配的被初始化为"hello"字符串的地址。
当线程退出时,所有基于堆栈分配的资源都会被销毁,编译器会产生代码调用string::~string()来保证销毁为string类对象所分配的资源。

进程内每个线程都有其私有的堆栈资源。

所以你所说的
如果调用return,但对里面的string对象不调用~string(),那么内存正常

这条正确,编译器会对自动变量调用析构函数

如果调用pthread_exit(NULL),但对里面的string调用~string 那么内存正常
这条是胡说。你显式的调用一次析构函数,然后编译器产生代码调用一次析构函数,连续两次调用delete,如果析构函数在释放堆资源后,立即将指针成员置为NULL,不会出错。但如果连续针对某一指针调用delete,这时,堆结构已经破坏了。没有立即出错并不代表你的程序是正确的。


如果调用pthread_exit(NULL),但不掉用~string(),那么每次循环都会吃掉我给string里面的1M左右的空间
使用gcc -v 看一下你的编译器里面有没有enable-thread选项,如果有,不可能出现这种问题。如果你非要用一个根本不支持多线程的版本来编译一个多线程程序的话,进程的堆结构已经不知道被破坏成什么样子了。

从你的回贴我要鄙视所谓的牛人们,经验是比我丰富,知识面和深度是比我强,你泛泛而谈,自以为是的建议,为什么我就不能怀疑gcc版本太低,你这样测试过?你就敢这么肯定?

你比牛人要牛多了。牛人一般都是谨小慎微的先怀疑自己,狂牛先怀疑编译器。自你提出问题到现在,你自己做了什么测试,得到了什么结论?什么叫做"泛泛而谈,自以为是的建议"?连别人的正确建议都看不明白的狂牛懂不懂什么叫尊重别人。

做为一个成年人,把权力和义务分清楚。在论坛里,没有人有义务来帮你。如果遇到的都是像你这样的,我宁愿一边喝茶一边看笑话。

论坛徽章:
0
19 [报告]
发表于 2005-12-21 16:22 |只看该作者

回复 18楼 renstone921 的帖子

楼上的哥们,你仔细看清楚了,别动不动就摆出一付教训人的样子。
1〉我的意思是函数内string 对象里面的堆空间申请,而不是对象本身。这些基本的东西我就不跟你扯了,你了解得很透彻,但我未必没读过书,所以轮不到你头脑发热来教训俺
2> 你的这句话
====================================
如果调用pthread_exit(NULL),但对里面的string调用~string 那么内存正常
这条是胡说。你显式的调用一次析构函数,然后编译器产生代码调用一次析构函数,连续两次调用delete,如果析构函数在释放堆资源后,立即将指针成员置为NULL,不会出错。但如果连续针对某一指针调用delete,这时,堆结构已经破坏了。没有立即出错并不代表你的程序是正确的。
====================================
你说对了一半,说错了一半。编译器会调用析构函数没错,可关键编译器在什么时候调用析构函数?你敢肯定所有编译器都一样么?我的测试结果告诉我(linux redhat9.0+gcc 3.2.2环境下) C++对象超出他定义范围时,编译器自动调用析构函数,可现在问题就出在编译器并没有在pthread_exit(NULL)之前调用过析构函数!而当注释掉pthread_exit之后,则真正调用了析构函数(目前我的猜测是编译器自动调用析构函数应该是在goto,return,右大括符(})之前调用);所以你说的我在pthread_exit(NULL)之前显式调用string::~string()函数所以不会存在多次delete,废话不多说,我附上我的测试程序,您老人家倒杯茶回家慢慢测试去吧,记得gcc环境相同,别强词夺理,动不动胡说,动动手,再发言。中科院都说了,院士只代表在某方面做过杰出贡献,并不代表他在某方面是权威,尊重事实,尊重科学
3〉===牛人一般都是谨小慎微的先怀疑自己,狂牛先怀疑编译器。==对于您老的这句话,俺不懂,俺啥都不是,就想让程序能完成应该完成的工作,结果不对,我就需要不停的测试。这话您收回去吧,我这个问题已经测试好久了,本来是一个通信程序,发现内存泄漏,第一步就是花了大量时间测试自己的协议类是否有内存泄漏,然后测试自己的闲程框架,再后来查了好多资料才怀疑编译器。不过你怎么说都跟我没关系,我不聪明,做事比较傻,牛人谈不上,如门级程序员都不算,但我会实事求是,动手测试,结果才是最重要的
4〉=======做为一个成年人,把权力和义务分清楚。在论坛里,没有人有义务来帮你==== 这话俺不同意
论坛里面无所谓帮不帮,什么叫分享,什么叫共同讨论,什么叫共同测试,什么共同解决问题,这是我最喜欢的东西,动不动帮助、教育,俺就看不惯!如果你觉得这叫帮助我,你回家喝茶看自己笑话去吧!别来玷污我的心情!如果你把这里的每个问题当作一起解决、动手测试,或者说更加提高自身的编程修养,那么我就道歉,不好意思,说话比较冲,请多多包含。

下面附上测试程序,g++ 编译之后麻烦 通过./a.out >> mem.log来执行,至于程序怎么跑的,自己看吧
==================================================================
//不进行通信,直接运行空循环体
#include <stdio.h>
#include <iostream>
#include <vector>
#include <semaphore.h>
#include <pthread.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

using namespace std;


#define _MAXMASSAGECOUNT_ 1024*64

#define _STACK_SIZE_ 2UL*1024UL*1024UL

//事务条目
#define _AFFAIR_COUNT_ 5

#define _PHTREAD_DETCH_ PTHREAD_CREATE_JOINABLE

void exitFuction()
{
        cout << "exit...." << endl;       
}

class myTest
{
        public:               
                myTest()
                {
                        m_buf = new char[1024*1024];
                        memset(m_buf,0x0,1024*1024);
                        memset(m_buf,'a',1024*1024-1);
                }
               
                ~myTest()
                {
                        if( m_buf != NULL )
                        {
                                delete[] m_buf;       
                        }
                       
                        cout << "~myTest() is called" << endl;
                }
       
        protected:
                char *m_buf;
};


//输出当前进程内存信息
void writeStatus()
{
        if( getpid() <= 0 )
        {
                return;
        }
       
        char cmd[128];       
        memset(cmd,0x0,12;       
        sprintf(cmd,"/bin/cat /proc/%d/status",getpid());
        cout << "=========" << cmd << "=========" << endl;       
        system(cmd);       
        return;       
}

void* sendMsgs(void *arg)
{
        cout << "child pthread start" << endl;
       
        myTest getTest;               
       
       
        char buf[1024*1024];
        memset(buf,0x0,1024*1024);
        memset(buf,'a',1024*1024 - 1 );       
        writeStatus();
        cout << "child end" << endl;       
        pthread_exit(NULL); //此处与return 轮回注释来测试是否调用了myTest::~myTest函数
        //return NULL;
}

int main()
{
        atexit(&exitFuction);
       
        cout << "pragram started...." << endl;       
       
        writeStatus();       
                       
        unsigned int i = 0;
       
        /*
        //测试进程内存空间
        while( i < _AFFAIR_COUNT_ )
        {
                i ++;
                cout << "\t" << i << ".fork  start For" << endl;
                writeStatus();
               
                pid_t mypid = fork();
                if( mypid > 0 )
                {
                        //父进程
                        cout << "Father:fork good: " << mypid  <<  endl;
                        cout << "wating Son...." << endl;
                        waitpid(mypid,NULL,0);
                        writeStatus();
                }
                else if( mypid == 0 )
                {
                        //子进程
                        cout << "========Son start.....========" << endl;
                        writeStatus();
                        int j = 0;
                        string goodstr = "";
                        while( j < _MAXMASSAGECOUNT_ )
                        {
                                goodstr += "abcfefdasfadsdasffffffffffffffffafffffffffffffffffdaaaaaaaaafds";
                                j ++;
                        }
                        cout << "======================" << endl;
                        writeStatus();
                        cout << "=======Son end=========" << endl;
                                               
                        exit(0);       
                }
                else
                {
                        cout << " fork failture!" << strerror(errno) << endl;       
                }
        }       
       
        i = 0;
       
        cout << "fork end,started pthread... " << endl;
        writeStatus();
       
        */
       
        //测试线程内存空间
        while( i < _AFFAIR_COUNT_ )
        {
                cout << i << endl;
                writeStatus();
                               
                i ++;
                int flag = 0;
                pthread_attr_t pthread_attr;
                pthread_attr_init(&pthread_attr);
                void * addr = NULL;
                addr = malloc(_STACK_SIZE_);
                memset(addr,0x0,_STACK_SIZE_);
                //pthread_attr_setdetachstate(&pthread_attr,_PHTREAD_DETCH_);
                pthread_attr_setstack(&pthread_attr,addr,_STACK_SIZE_);
                pthread_t threadSend;
                if( (flag = pthread_create(&threadSend,&pthread_attr,&sendMsgs,NULL) != 0 ) )
                {
                        cout << "create Error(threadSend):" << flag << endl;
                        free(addr);
                        pthread_attr_destroy(&pthread_attr);
                        break;
                }               
               
                if( pthread_join(threadSend,NULL) == 0 )
                {
                        cout << "child exit good" << endl;       
                }
                else
                {
                        cout << "child exit failture" << endl;       
                }
               
                free(addr);               
                pthread_attr_destroy(&pthread_attr);
                                               
        }
       
       
        cout << "waiting ..." << endl;
        writeStatus();
       
        return -1;
}

论坛徽章:
0
20 [报告]
发表于 2005-12-22 11:28 |只看该作者
原帖由 sevendays 于 2005-12-21 16:22 发表
楼上的哥们,你仔细看清楚了,别动不动就摆出一付教训人的样子。
1〉我的意思是函数内string 对象里面的堆空间申请,而不是对象本身。这些基本的东西我就不跟你扯了,你了解得很透彻,但我未必没读过书,所以轮不 ...


ok, fair enough. 这是我的测试结果. 我的机器是: Redhat AS3, Linux2.4.21 gcc3.2.3


  1. pragram started....
  2. =========/bin/cat /proc/27332/status=========
  3. Name:        a.out
  4. State:        S (sleeping)
  5. Tgid:        27332
  6. Pid:        27332
  7. PPid:        27260
  8. TracerPid:        0
  9. Uid:        547        547        547        547
  10. Gid:        507        507        507        507
  11. FDSize:        64
  12. Groups:        507
  13. VmSize:            9908 kB
  14. VmLck:               0 kB
  15. VmRSS:             944 kB
  16. VmData:             148 kB
  17. VmStk:             804 kB
  18. VmExe:               8 kB
  19. VmLib:            3760 kB
  20. SigPnd:        0000000000000000
  21. ShdPnd:        0000000000000000
  22. SigBlk:        0000000000010000
  23. SigIgn:        0000000000000006
  24. SigCgt:        0000000080000000
  25. CapInh:        0000000000000000
  26. CapPrm:        0000000000000000
  27. CapEff:        0000000000000000
  28. 0
  29. =========/bin/cat /proc/27332/status=========
  30. Name:        a.out
  31. State:        R (running)
  32. Tgid:        27332
  33. Pid:        27332
  34. PPid:        27260
  35. TracerPid:        0
  36. Uid:        547        547        547        547
  37. Gid:        507        507        507        507
  38. FDSize:        64
  39. Groups:        507
  40. VmSize:            9908 kB
  41. VmLck:               0 kB
  42. VmRSS:             976 kB
  43. VmData:             148 kB
  44. VmStk:             804 kB
  45. VmExe:               8 kB
  46. VmLib:            3760 kB
  47. SigPnd:        0000000000000000
  48. ShdPnd:        0000000000000000
  49. SigBlk:        0000000000010000
  50. SigIgn:        0000000000000006
  51. SigCgt:        0000000080000000
  52. CapInh:        0000000000000000
  53. CapPrm:        0000000000000000
  54. CapEff:        0000000000000000
  55. child pthread start
  56. =========/bin/cat /proc/27332/status=========
  57. Name:        a.out
  58. State:        S (sleeping)
  59. Tgid:        27332
  60. Pid:        27332
  61. PPid:        27260
  62. TracerPid:        0
  63. Uid:        547        547        547        547
  64. Gid:        507        507        507        507
  65. FDSize:        64
  66. Groups:        507
  67. VmSize:           13120 kB
  68. VmLck:               0 kB
  69. VmRSS:            4092 kB
  70. VmData:            3360 kB
  71. VmStk:             804 kB
  72. VmExe:               8 kB
  73. VmLib:            3760 kB
  74. SigPnd:        0000000000000000
  75. ShdPnd:        0000000000000000
  76. SigBlk:        0000000000000000
  77. SigIgn:        0000000000000006
  78. SigCgt:        0000000080000000
  79. CapInh:        0000000000000000
  80. CapPrm:        0000000000000000
  81. CapEff:        0000000000000000
  82. child end
  83. ~myTest() is called
  84. child exit good
  85. 1
  86. =========/bin/cat /proc/27332/status=========
  87. Name:        a.out
  88. State:        S (sleeping)
  89. Tgid:        27332
  90. Pid:        27332
  91. PPid:        27260
  92. TracerPid:        0
  93. Uid:        547        547        547        547
  94. Gid:        507        507        507        507
  95. FDSize:        64
  96. Groups:        507
  97. VmSize:           10040 kB
  98. VmLck:               0 kB
  99. VmRSS:            1056 kB
  100. VmData:             280 kB
  101. VmStk:             804 kB
  102. VmExe:               8 kB
  103. VmLib:            3760 kB
  104. SigPnd:        0000000000000000
  105. ShdPnd:        0000000000000000
  106. SigBlk:        0000000000010000
  107. SigIgn:        0000000000000006
  108. SigCgt:        0000000080000000
  109. CapInh:        0000000000000000
  110. CapPrm:        0000000000000000
  111. CapEff:        0000000000000000
  112. child pthread start
  113. =========/bin/cat /proc/27332/status=========
  114. Name:        a.out
  115. State:        S (sleeping)
  116. Tgid:        27332
  117. Pid:        27332
  118. PPid:        27260
  119. TracerPid:        0
  120. Uid:        547        547        547        547
  121. Gid:        507        507        507        507
  122. FDSize:        64
  123. Groups:        507
  124. VmSize:           13120 kB
  125. VmLck:               0 kB
  126. VmRSS:            4136 kB
  127. VmData:            3360 kB
  128. VmStk:             804 kB
  129. VmExe:               8 kB
  130. VmLib:            3760 kB
  131. SigPnd:        0000000000000000
  132. ShdPnd:        0000000000000000
  133. SigBlk:        0000000000000000
  134. SigIgn:        0000000000000006
  135. SigCgt:        0000000080000000
  136. CapInh:        0000000000000000
  137. CapPrm:        0000000000000000
  138. CapEff:        0000000000000000
  139. child end
  140. ~myTest() is called
  141. child exit good
  142. 2
  143. =========/bin/cat /proc/27332/status=========
  144. Name:        a.out
  145. State:        R (running)
  146. Tgid:        27332
  147. Pid:        27332
  148. PPid:        27260
  149. TracerPid:        0
  150. Uid:        547        547        547        547
  151. Gid:        507        507        507        507
  152. FDSize:        64
  153. Groups:        507
  154. VmSize:           10040 kB
  155. VmLck:               0 kB
  156. VmRSS:            1056 kB
  157. VmData:             280 kB
  158. VmStk:             804 kB
  159. VmExe:               8 kB
  160. VmLib:            3760 kB
  161. SigPnd:        0000000000000000
  162. ShdPnd:        0000000000000000
  163. SigBlk:        0000000000010000
  164. SigIgn:        0000000000000006
  165. SigCgt:        0000000080000000
  166. CapInh:        0000000000000000
  167. CapPrm:        0000000000000000
  168. CapEff:        0000000000000000
  169. child pthread start
  170. =========/bin/cat /proc/27332/status=========
  171. Name:        a.out
  172. State:        S (sleeping)
  173. Tgid:        27332
  174. Pid:        27332
  175. PPid:        27260
  176. TracerPid:        0
  177. Uid:        547        547        547        547
  178. Gid:        507        507        507        507
  179. FDSize:        64
  180. Groups:        507
  181. VmSize:           13120 kB
  182. VmLck:               0 kB
  183. VmRSS:            4136 kB
  184. VmData:            3360 kB
  185. VmStk:             804 kB
  186. VmExe:               8 kB
  187. VmLib:            3760 kB
  188. SigPnd:        0000000000000000
  189. ShdPnd:        0000000000000000
  190. SigBlk:        0000000000000000
  191. SigIgn:        0000000000000006
  192. SigCgt:        0000000080000000
  193. CapInh:        0000000000000000
  194. CapPrm:        0000000000000000
  195. CapEff:        0000000000000000
  196. child end
  197. ~myTest() is called
  198. child exit good
  199. 3
  200. =========/bin/cat /proc/27332/status=========
  201. Name:        a.out
  202. State:        S (sleeping)
  203. Tgid:        27332
  204. Pid:        27332
  205. PPid:        27260
  206. TracerPid:        0
  207. Uid:        547        547        547        547
  208. Gid:        507        507        507        507
  209. FDSize:        64
  210. Groups:        507
  211. VmSize:           10040 kB
  212. VmLck:               0 kB
  213. VmRSS:            1056 kB
  214. VmData:             280 kB
  215. VmStk:             804 kB
  216. VmExe:               8 kB
  217. VmLib:            3760 kB
  218. SigPnd:        0000000000000000
  219. ShdPnd:        0000000000000000
  220. SigBlk:        0000000000010000
  221. SigIgn:        0000000000000006
  222. SigCgt:        0000000080000000
  223. CapInh:        0000000000000000
  224. CapPrm:        0000000000000000
  225. CapEff:        0000000000000000
  226. child pthread start
  227. =========/bin/cat /proc/27332/status=========
  228. Name:        a.out
  229. State:        S (sleeping)
  230. Tgid:        27332
  231. Pid:        27332
  232. PPid:        27260
  233. TracerPid:        0
  234. Uid:        547        547        547        547
  235. Gid:        507        507        507        507
  236. FDSize:        64
  237. Groups:        507
  238. VmSize:           13120 kB
  239. VmLck:               0 kB
  240. VmRSS:            4136 kB
  241. VmData:            3360 kB
  242. VmStk:             804 kB
  243. VmExe:               8 kB
  244. VmLib:            3760 kB
  245. SigPnd:        0000000000000000
  246. ShdPnd:        0000000000000000
  247. SigBlk:        0000000000000000
  248. SigIgn:        0000000000000006
  249. SigCgt:        0000000080000000
  250. CapInh:        0000000000000000
  251. CapPrm:        0000000000000000
  252. CapEff:        0000000000000000
  253. child end
  254. ~myTest() is called
  255. child exit good
  256. 4
  257. =========/bin/cat /proc/27332/status=========
  258. Name:        a.out
  259. State:        S (sleeping)
  260. Tgid:        27332
  261. Pid:        27332
  262. PPid:        27260
  263. TracerPid:        0
  264. Uid:        547        547        547        547
  265. Gid:        507        507        507        507
  266. FDSize:        64
  267. Groups:        507
  268. VmSize:           10040 kB
  269. VmLck:               0 kB
  270. VmRSS:            1056 kB
  271. VmData:             280 kB
  272. VmStk:             804 kB
  273. VmExe:               8 kB
  274. VmLib:            3760 kB
  275. SigPnd:        0000000000000000
  276. ShdPnd:        0000000000000000
  277. SigBlk:        0000000000010000
  278. SigIgn:        0000000000000006
  279. SigCgt:        0000000080000000
  280. CapInh:        0000000000000000
  281. CapPrm:        0000000000000000
  282. CapEff:        0000000000000000
  283. child pthread start
  284. =========/bin/cat /proc/27332/status=========
  285. Name:        a.out
  286. State:        S (sleeping)
  287. Tgid:        27332
  288. Pid:        27332
  289. PPid:        27260
  290. TracerPid:        0
  291. Uid:        547        547        547        547
  292. Gid:        507        507        507        507
  293. FDSize:        64
  294. Groups:        507
  295. VmSize:           13120 kB
  296. VmLck:               0 kB
  297. VmRSS:            4136 kB
  298. VmData:            3360 kB
  299. VmStk:             804 kB
  300. VmExe:               8 kB
  301. VmLib:            3760 kB
  302. SigPnd:        0000000000000000
  303. ShdPnd:        0000000000000000
  304. SigBlk:        0000000000000000
  305. SigIgn:        0000000000000006
  306. SigCgt:        0000000080000000
  307. CapInh:        0000000000000000
  308. CapPrm:        0000000000000000
  309. CapEff:        0000000000000000
  310. child end
  311. ~myTest() is called
  312. child exit good
  313. waiting ...
  314. =========/bin/cat /proc/27332/status=========
  315. Name:        a.out
  316. State:        S (sleeping)
  317. Tgid:        27332
  318. Pid:        27332
  319. PPid:        27260
  320. TracerPid:        0
  321. Uid:        547        547        547        547
  322. Gid:        507        507        507        507
  323. FDSize:        64
  324. Groups:        507
  325. VmSize:           10040 kB
  326. VmLck:               0 kB
  327. VmRSS:            1056 kB
  328. VmData:             280 kB
  329. VmStk:             804 kB
  330. VmExe:               8 kB
  331. VmLib:            3760 kB
  332. SigPnd:        0000000000000000
  333. ShdPnd:        0000000000000000
  334. SigBlk:        0000000000010000
  335. SigIgn:        0000000000000006
  336. SigCgt:        0000000080000000
  337. CapInh:        0000000000000000
  338. CapPrm:        0000000000000000
  339. CapEff:        0000000000000000
  340. exit....
复制代码


数据显示, gcc调用了析构函数 ( pthread_exit(NULL)退出线程 )

LZ 能否贴一下你的测试数据. 因我没有RedHat 9, gcc 3.2.2
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP