<<<<<<<<<<<<<类的成员变量在那里分配? 新线程是否可以访问老线程中, 类实例的成员变量呢??

zcxx5201314 2005-08-04 04:02:09
class aclass
{
public:

int y;

void test( int x );

}

void aclass::test(int x);
{
this->y=x
}

aclass A;
===========================
现在,在AfxBeginThread(XtoY)的新线程中:
入口函数:

XtoY(aclass pA)
{
pA->test(100);
}

那么,在新线程中pA->y 应当等于100;

Q1.
在旧线程中呢? pA->y的值是否被改变呢?

因为两个线程自然会有两个栈, 如果成员变量是在栈上分配,

那旧线程的中pA->y就不应当被改变.

Q2.

pA = &A;

当传递给XtoY的时候,

线程应当切换栈的基地址吧,那么,这时候的pA还有效嘛?

希望大家不吝赐教啊.
...全文
178 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcxx5201314 2005-08-05
  • 打赏
  • 举报
回复
各位老大,别太注重细节了..

我问的是成员变量在那里分配的问题.


新线程调用了使用成员变量的成员函数后,会不会有问题.


这东西还真TM的难描述.
zcxx5201314 2005-08-05
  • 打赏
  • 举报
回复
唉,别管pA怎么来的,pA就是指向类对象的指针.

pA->test()这样调用时,test()函数中用到了类的成员变量.

那么成员变量的栈的基址会变吧!因为pA->test()是在另一个线程中调用的.
netgm 2005-08-05
  • 打赏
  • 举报
回复
我晕咧.
thread1()
{
aclass A;
AfxBegingThread( thread2(&A), 0)
}

thread2(aclass * pA);
{
pA->test();
}

你的thread2的 pA是怎么来的..不是难道是thread2自己创建的啊.
zcxx5201314 2005-08-05
  • 打赏
  • 举报
回复
你们到底看没看啊.

:::

但是访问方法不同,使用起来就不一样了,

比如:int i ; func(&i);

这样的局部栈变量i,当然可以在别的函数或者线程中使用.

但是C++中的成员变量是不一样的.

我不是通过&来传递成员变量的地址,知道嘛!

而是成员函数中正常使用成员变量.

但这时突然另一个线程调用了它,因为基地址被改变了.
netgm 2005-08-05
  • 打赏
  • 举报
回复
&A 就不是指针了..也差不多了..你由函数定义作了转换
zcxx5201314 2005-08-05
  • 打赏
  • 举报
回复
通过指针传递,接收指针的一方不必知道这个指针的地址是堆栈还是其他的。

========================================

这个我知道,但问题不通过指针传递啊.
netgm 2005-08-05
  • 打赏
  • 举报
回复
呵呵.是的.晕了
不过不是多线程调用..是不会有问题滴
多线程.就考虑下吧
nelsonc 2005-08-04
  • 打赏
  • 举报
回复
你说的基地址改变是什么意思?
多个线程的堆栈是放在内存的不同地址的。所以不存在这个线程不能放问其它线程堆栈的问题的。
通过指针传递,接收指针的一方不必知道这个指针的地址是堆栈还是其他的。
你最好能够试一下,就知道了。
zcxx5201314 2005-08-04
  • 打赏
  • 举报
回复
因而它的基地址被改变了,这时会不会有什么问题?
zcxx5201314 2005-08-04
  • 打赏
  • 举报
回复
楼上的,这个我当然知道,

但是访问方法不同,使用起来就不一样了,

比如:int i ; func(&i);

这样的局部栈变量i,当然可以在别的函数或者线程中使用.

但是C++中的成员变量是不一样的.

我不是通过&来传递成员变量的地址,知道嘛!

而是成员函数中正常使用成员变量.

但这时突然另一个线程调用了它,因为基地址被改变了.
goodboyws 2005-08-04
  • 打赏
  • 举报
回复
只要Stack不释放,地址就有效,也就是说,只要旧线程不退出,新线程就可以使用他的Stack指针,
同一进程的线程之间的内存地址是共享的,也就是说,尽管线程有自己的Stack,但Stack内存地址是不冲突的
binscut 2005-08-04
  • 打赏
  • 举报
回复
建议你看一下<windowns核心编程>,你就会弄清楚这些概念了
zcxx5201314 2005-08-04
  • 打赏
  • 举报
回复
nelsonc(软件兔)

binscut(迷雾)


不知道访问成员变量时,是否用到栈的基地址,如果用不到,那栈有什么用呢,对吧,

如果用到话,那成员变量在不同线程中,如何可以访问呢? 因为它们的栈基址不同啊.

比如:线程1,线程2 都有对象指针pA 指向同一个对象.

那1 2 中 的 a.y 是同一个内存单元嘛? 如何做到的.

我问的不是传递一个普通的栈变量地址,而是通过对象指针对访问时,是否可以.

例:

thread1()
{
aclass A;
AfxBegingThread( thread2(&A), 0)
}

thread2(aclass * pA);
{
pA->test();
}


test()函数中,对aclass的成员变量y进行了操作.

实际上当执行test()内部时,栈基址已经变成了thread2的基址啊.

test()
{
this->y =100;
}

此时,它是如何得到y的正确地址呢??
binscut 2005-08-04
  • 打赏
  • 举报
回复
1.只要在同一虚拟空间地址中,传递虚拟地址都可以访问到变量
2.有效
同一进程的不同线程中的地址传递是有效的,但不同进程之间传递的地址就无效了,一知道是不是你要知道的?
nelsonc 2005-08-04
  • 打赏
  • 举报
回复
你的程序有问题。
XtoY(aclass pA)
{
pA->test(100);
}

pA到底是aclass还是aclass *?

1. 关于类成员变量内存分配的问题:
类的成员变量的内存分配可以在栈中,也可以不在,关键看你是怎么定义的变量。
如果定义的变量属于局部变量,那么类的成员就在栈中。
如:
func()
{
aclass a;
}
如果是动态分配的内存,类成员就在动态分配的内存中。
如:
func()
{
aclass * pa = new aclass();
}
如果类成员是全局的,那就在程序的数据内存中。
如:
aclass g_a; // 在函数外面

2. 关于多线程的问题
每个线程都有自己的栈。在一个线程中,不能访问另一个线程堆栈中的变量,但可以访问动态分配的和程序数据段中的变量。
所以,如果你是用上面第一种方法定义变量,就不可以在其它线程中使用。
如果你用其他方法定义变量,就可以在其它线程只用,其它线程对类成员的影响是全局的,也就是说其他任何现成都可以看到他的变化。
zcxx5201314 2005-08-04
  • 打赏
  • 举报
回复
你根本不知道我在问什么.
binscut 2005-08-04
  • 打赏
  • 举报
回复
aclass A;
AfxBeginThread(XtoY,&A);

入口函数:
UINT XtoY( LPVOID pParam )
{
aclass *pA = (aclass *)pParam;
pA->test(100);
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧