先说出我的疑问:线程之间可以共享局部变量吗?写了一个console程序:
在它的main()函数里面创建了一个对象,Endpoint  instance;Endpoint是类名。然后又new了一个线程对象(用的不是mfc,是另一个基础类库pwlib,它里面提供了一个线程类PThread,创建该对象后自动启动一新的线程,在线程函数里面调用该类的虚拟成员函数Main()), 
代码如下:
main()

 ....
 Endpoint  instance;
 H323ListenerTCP * listener;//该类是个PThread的子类
 listener  = new H323ListenerTCP(instance, interfaceAddress, listenPort);
 //后面两个参数不去管它,主要看第一个参数
 .....}
再来看看线程对象里面的Main()函数:
Main()
{   while (listener.IsOpen()) {
    H323Transport * transport = Accept(PMaxTimeInterval);
    if (transport != NULL)
      new H225TransportThread(instance, transport);//看到了吧,这里涌到了 另一个线程创建的局部变量instance,而且把她又传给了一个新的线程(H225TransportThread也是个线程类的派生类)  }
这是程序运行的很好,我不知道为什么,每个线程步事都有自己的堆栈吗?instancey应该在主线程的堆栈里面,当运行其他线城时,又有自己新的堆栈了,这时instance 放在什么地方了,不明白,望高手指点。

解决方案 »

  1.   

    这个类库没用过,但给我的感觉,instance好象是被当作参数传进来的,应为在Main()并没有看到它的定义。当你new第一个线程时它被当作参数传了进来,然后又被当作参数传给了第二个线程。传递的是拷贝还是引用,这要看你线程类的构造函数了。不过看意思应该是个引用(猜测而已)。
      

  2.   

    几位说得没错,上面的代码不全,在创建线程对象的时候,instance作为构造函数的参数传到县城对象的成员变量,Main()函数用的就是它的成员变量,但是如果该操作是在两个非主线程之间进行,如果创建对象的线程执行完毕,那么它的变量将被收回,其他的线程如在引用的画起步事会出错?
      

  3.   

    如果参数不是按照引用的方是传过来的(就是&方式),而是普通的拷贝方式的话就不会有错,因为传的是值,构造函数先声明了一个变量,在把传过来的值赋进去。此变量的值与原始变量相等,但内存地址不同。这点希望楼主明白。