一个进程内有A,B,C等几个线程,
请问A,B,C,线程内变量的内存地址会不会出现重复?比如进程的地址空间从:
ox 0000 0000
......
0x 1FFF FFFF那么A,B,C,3个线程所占的地址空间是不是都只是进程内的一部分?
给定一个地址,比如0x 1FFE 0000,处的变量只可能是一个线程中的数据,要么是A ,要么B,或C。就是说A,B,C三个线程所占的内存不会重合,而是共同构成进程内存的一部分。

解决方案 »

  1.   

    据我所知,一个进程内所有的线程都是共享同一个地址空间,除非使用 TLS。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  2.   

    呵呵,楼主可以去看看操作系统的书像内存地址空间这样的资源,都是进程统一管理的,进程内线程共享
    比如 windows 的虚拟内存,每个进程都用 4GB 的虚拟内存空间,线程共享简单说,进程统一管理程序资源,线程是用于执行调度的
      

  3.   


    进程中的内存要被很多人使用的, 线程使用的内存只是一个线程栈而已,大概有1M或者4M,总之不大,这个用户线程的内的零时变量分配,线程执行的代码在代码段中,多个线程执行一个函数,他们存储函数的内存是相同的
    进程中有很多系统DLL,第三放DLL等都是在这个进程内存中,
    线程使用的内存就2个. 栈,每个线程都有一个, 线程执行的代码,代码是唯一的,可以有多个线程执行
      

  4.   

    你错!hehe, 开个玩笑,别介意 :)“线程使用的内存”具体多少个我说不准,但粗粗说来就不止 2 个,至少还有“常量数据段”和“堆”,它们跟“代码段”一样,都是整个进程中所有线程共用的。只有“栈”是每个线程自己的。动态分配(new/alloc)得到的数据对象,都是在“堆”里的,可以在多个线程中同时访问,而如何保证多个线程并发访问时不出现冲突的问题,正是“线程安全”所主要考虑的事情。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  5.   

    都是相同的内存空间, 都是能够直接访问的.简单来说
    线程1的栈变量, 只要被引用到外部, 被其他线程访问修改的话, 这个变量也是会改变其值的, 但必须当前调用的函数在外部修改访问完毕前不能够返回. 
    线程1里面new出来的堆变量, 引用到外部, 被其他线程访问是依旧合法的, 但必须访问修改完毕前, 不能够delete.TLS只是一种线程动态内存管理方式, 并不代表其里面的内存是独立的, 只能够说线程new出来的东西, 可以在线程退出时通过TLS的管理机制得到全部释放而已.
      

  6.   

    不会,要的话开共享内存,CreateFileMap()
      

  7.   

    不会的,每个线程在创建时(
    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES lpsa, 
      DWORD cbStack, 
      LPTHREAD_START_ROUTINE lpStartAddr, 
      LPVOID lpvThreadParam, 
      DWORD fdwCreate, 
      LPDWORD lpIDThread
    ); 
    ),第二个参数,就是用于分配堆栈的,在内存地址上不会冲突,但是若资源访问对象相同时就不好说了
      

  8.   

    晓得了,其实同一个进程下的线程间是变量(MFC对象要靠句柄)是可以互相访问,改变值的,当然考虑同步的问题。