读书人

请问成员函数和线程安全的有关问题

发布时间: 2012-02-04 15:43:09 作者: rapoo

请教成员函数和线程安全的问题
在C++对象的内存布局里面,成员函数并没有放在对象的内存中,而是放在对象之外的某个地方。并且貌似函数的地址是针对类而不是针对对象的,比如:

C/C++ code
class C{public:    int foo();};

那么:
C/C++ code
printf("Address:%p", &C:foo);

可以打印出这个函数的地址。

我想不通的是,既然函数的地址对类的对象是统一的,那么不同的对象同时调用这个函数的时候,就会从相同的入口地址开始执行,那不会有问题吗?

[解决办法]
不同的对象在调用函数时,this指针值隐式传人成员函数,即不同的对象调用这个函数的时候,这个函数操作不同的对象,此时显然不存在共享资源竞争的问题。
[解决办法]
1楼说了,,,


函数不是属于对象的,是属于类的, 这个表达不严谨,大概是这个意思

通过this指针, this表示对象的地址,

int foo(对象地址); 会插入一个对象地址, 然后这个对象地址->foo函数。。。

去查找到函数。。。


线程是另外一回事。。。

比如:一个类中加一个线程函数, 必须用static消除this指针。。。。。。

这是windows编程遇到的个问题。。。。

static修饰一个函数,表示着函数,可以不需要用this就,可以找到它,然后调用它。


[解决办法]
不会有问题的.
C:foo的首地址在同一进程中是固定的(一般是基址+偏移), 而多线程同时对同一内存进行读取和执行是不会有问题, 除非传入的this一样而又对this及其相关内存进行写操作
[解决办法]
class Sample
{

int val;

std::string name;

public:

Sample(int data, std::string str):val(data),name(str){}


std::string GetName() const
{
return name;
}
};

int main()
{


Sample obj(23,"csdn");

std::string strName=obj.GetName();
001A398C lea eax,[ebp-60h] ;取对象地址,即:this 指针
001A398F push eax //this压入栈中
001A3990 lea ecx,[ebp-38h] ;strName的地址
001A3993 call Sample::GetName (1A11F4h)

return 0;

}





探讨

引用:

...会插入一个对象地址...

...必须用static消除this指针...


补充下, 不是插入一个对象地址, 而是将实例类指针隐式传递(常通过寄存器), 这也是成员函数和普通函数的最大区别, static声明的函数跟普通函数没有两样了.

[解决办法]
不同对象用不同的地址调用
[解决办法]
探讨

不会有问题的.
C:foo的首地址在同一进程中是固定的(一般是基址+偏移), 而多线程同时对同一内存进行读取和执行是不会有问题, 除非传入的this一样而又对this及其相关内存进行写操作

[解决办法]
代码段就是可以被任意调用的,它一般作为只读,你的数据段和堆栈段不同即可。。

读书人网 >C++

热点推荐