预备知识:
1,类中的方法不是所有类对象独有的。换句话说:一个类的多个对象,共享同一份类成员方法。函数是共享的。
2,同一个类的多个对象,使用this区分。(类内部访问)每个类有自己的指针,构造对象时候确定。
3,使用静态(static)修饰的成员方法没有this指针,可以通过XXX::xxx(域名)方式调用。
问题来了:
假设同一个类的多个对象,共用同一个成员方法。通过这个成员方法如何区分不同的对象?
并且调用方法时static的静态方法,不需要通过指针以及引用等方式调用相应的对象方法。
这里提一下thread_local 修饰符号。这个告诉编译器这个变量是线程特有的。每个线程存有一个自己的副本,因此多个对象在不同的线程中使用自己的副本。相互不影响。
接下来看看怎么使用。这个例子是想要实现:
1,一个类的多个对象,每个对象在一个指定线程中使用。
2,多个对象使用同一个方法获取本对象的指针。
3,没有使用额外的数据结构,map,list等容器有序存放对象指针。
class AthreadLocal
{
public:
AthreadLocal() = default;
void init()
{
local_ptr = this;
}
static AthreadLocal * get_local()
{
return local_ptr; //获取本实例的对象指针
}
private:
AthreadLocal(const AthreadLocal &local_) =delete;
AthreadLocal& operator(const AthreadLocal &local_) = delete;
static local_thread AthreadLocal *local_ptr; //线程变量,每个线程各自有自己的副本
};
thread_local AthreadLocal* AthreadLocal::local_ptr = nullptr;
void func(AthreadLocal *local_)
{
local_->init(local_);
//通过调用全局AthreadLocal::get_local方法(虽然没有this指针)
//获取本线程内的AthreadLocal::local_ptr。
//虽然使用了静态方法获取的对象指针,但是在本线程中,获取的就是之前init函数中设置的对象指针。如不使用thread_local修饰,得到地址为0
AthreadLocal *ptr = AthreadLocal::get_local();
if(ptr == local_)
{
std::cout<<"get same pointer by static method"<<std::endl;
}
}
这里使用了static方法的目的个人认为:
1,方便调用,但是在线程内部还是要通过ptr去获取对象的地址。
2,静态方法不属于对象,在线程内调用时候却可以获得想要对象的地址。
3,在某一线程中调用静态方法将获取本线程中的local_thread变量。
随后补上测试:
int main()
{
AthreadLocal *ptr_1 = new AthreadLocal();
AthreadLocal *ptr_2 = new AthreadLocal();
AthreadLocal *ptr_3 = new AthreadLocal();
thread th1(func,ptr_1);
thread th2(func,ptr_2);
thread th3(func,ptr_3);
th1.join();
th2.join();
th3.join();
delete ptr_1;
delete ptr_2;
delete ptr_3;
return 0;
}