当前位置:  技术问答>linux和unix

unix多线程时子线程的堆和栈

    来源: 互联网  发布时间:2017-01-15

    本文导语:  各位好,最近刚刚接触Unix的多线程(pthread),遇到一个比较郁闷的问题,子线程有时会卡住 ,它不会往下执行,也不会core。后来查出问题,是因为有个变量new时申请空间太大了。 研究了下aix的多线程时的进程模型,...

各位好,最近刚刚接触Unix的多线程(pthread),遇到一个比较郁闷的问题,子线程有时会卡住 ,它不会往下执行,也不会core。后来查出问题,是因为有个变量new时申请空间太大了。
研究了下aix的多线程时的进程模型,如下:
unix多线程时子线程的堆和栈 [图片]
它说,创建一个线程时,会在进程的堆区分配一块,作为线程栈(thread stack)使用。那线程中new出来的堆数据,是放到哪一块呢?
我写个小程序测试了下,线程主体代码如下: 
void thread_func()
{
        int i_val;
        printf("[线程%d]i_val =        t0x%016pn",pthread_self(),&i_val);
        int* pi = new int();
        if(pi == NULL)
        {
                fprintf(stderr,"分配内存失败n");
                return;
        }
        printf("[线程%d]pi =        tt0x%016pn",pthread_self(),pi);
        char* pMalloc;
        if((pMalloc = (char*) malloc(10)) == NULL)
        {
                return;
        }
        printf("[线程%d]pMalloc =     tt0x%016pn",pthread_self(),pMalloc);
        sleep(2);
}


创建了2个线程,结果如下:
[线程258]i_val =                0x0000000110044760
[线程258]pi =                   0x0000000110047670
[线程258]pMalloc =              0x0000000110047690
[线程515]i_val =                0x000000011007b760
[线程515]pi =                   0x000000011007eef0
[线程515]pMalloc =              0x000000011007ef10

照这个看来,它的堆地址和栈地址应该是在一块的,线程的堆区放在线程的栈区之后,同一个线程的栈区和堆区都放在 图中的 thread stack(96k)这个区,在Guard Page之上。
不知道我这样理解对不对?
另外,还是没办法搞清楚为什么有的程序子线程在执行的时候会卡住,而不是core掉。
请各位大侠不吝赐教!不盛感激!

|
个人猜测“卡”的原因: 你new 的东西太多,超过了96K的第一个内存页,然后需要向守护页面(guard page)借一页,访问守护页面时操作系统会得到通知。系统会再commit一个页面,把下一个页面作为新的守护页面。

你把new的东西减少一下,看是不是好的?

另外附上我在linux测试的结果,线程里面的栈 和 堆 是分开的

我的代码:
#include                                                                                                          
#include
#include

void* thread_func(void* arg)
{
        int i_val;
        printf("[thread %d]i_val= t0x%016pn",pthread_self(),&i_val);
        int* pi = new int();
        if(pi == NULL)
        {
                fprintf(stderr,"·Öä´Ã);
        }
        printf("[thread %d] pi = tt0x%016pn",pthread_self(),pi);
        char* pMalloc;
        if((pMalloc = (char*) malloc(10)) == NULL)
        {
        }
        printf("[thread %d]pmalloc =     tt0x%016pn",pthread_self(),pMalloc);
}

int main(int argc,int argv[])
{
    int error;
    int *temptr;
    pthread_t thread_id1, thread_id2;
    pthread_create(&thread_id1,NULL,thread_func,NULL);
    pthread_create(&thread_id2,NULL,thread_func,NULL);
    
    if(error=pthread_join(thread_id1,NULL))
    {
        perror("pthread_join");
        exit(EXIT_FAILURE); 
    }
    if(error=pthread_join(thread_id2, NULL))
    {
        perror("pthread_join");
        exit(EXIT_FAILURE); 
    }
    return 0;
}


在Linux下面用G++编译后结果为

[thread -1208198256]i_val=      0x0x000000b7fc53ac
[thread -1208198256] pi =               0x0x0000000804a0a0
[thread -1208198256]pmalloc =                   0x0x0000000804a0b0
[thread -1216590960]i_val=      0x0x000000b77c43ac
[thread -1216590960] pi =               0x0x0000000804a158
[thread -1216590960]pmalloc =                   0x0x0000000804a168

    
 
 

您可能感兴趣的文章:

  • 在unix下做webserver,使用多进程?多线程?
  • Unix的多线程问题
  • unix多线程数据传递问题
  • Unix中PThread是干什么用的,创建线程吗---小妹
  • 请问WINDOWS 和LINUX/UNIX 的进程、线程的区别
  • 在unix下如何编译多线程的程序?
  • UNIX下,什么函数可以取得当前线程ID?
  • unix下有多线程的概念吗,与fork的子进程有什么区别?
  • SCO UNIX 5.05下的线程软件包可以从哪里获得?(在线等待)
  • 看Unix环境高级编程,提到了V和bsd,有很多不同,但是没有提到Linux,请问linux跟BSD或者unix V 编程细节哪些不同的,特别是线程,进程,和socke
  • STL 在 UNIX 多线程 中不能用?
  • windows下面的线程代码怎么移植到unix下面去?
  • UNIX线程共用一个变量,出现core dump
  • 谁能给一个linux/unix下多线程同步的例子
  • UNIX的多线程技术一知半解,有没有好的书籍资料推荐?
  • 帮忙介绍适合于SCO UNIX 5。05版本的多线程包的下载地址(最好是成功的安装过)
  • Unix domain socket可用于同一个进程中的不同线程么?
  • 帮忙怎样写有关 unix下的线程的问题(在线等待,急用,谢谢)
  • UNIX中多个线程同时捕捉信号,信号由那个线程捕捉到?
  • unix/linux上用多线程还是多进程开发程序好?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • unix/Linux下c++ boost thread库读写锁介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 没有unix系统我如何学习unix
  • php将unix时间戳转换成字符串时间函数(date)
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • UNIX特急!!!digital unix问题,请专家快来!!!
  • UNIX支持中文否,请推荐UNIX好书
  • SCO UNIX 5.0用软盘启动之后无法启动UNIX
  • 散分!!unix 用户调查!!!你使用哪款unix
  • hp unix 和 sco unix的区别
  • 入门问题,我想向UNIX编程方向发展,单目前不会UNIX,我该如何做
  • 强烈建议将linux/Unix栏目放到“软件开发者”大类里面来。----Unix开发的人助威支持!!!
  • 现在那些unix比较流行?Linux和 Unix有 什么区别?
  • 小问题, Unix 如何建立一个文件 ,unix 文件有后缀名吗
  • 我想学习Unix,请高手给个下载网址,用linux来学习Unix差别大吗?
  • 没有unix系统我如何学习unix iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3