关于 C++ thread_local 变量理解

本文探讨如何在类的多个对象间使用线程局部变量(thread_local)来区分对象,并利用静态方法获取对象指针,实现无数据结构的线程内对象定位。通过实例解析AthreadLocal类的使用,展示在多线程环境下如何确保每个对象独立使用其方法和指针。
摘要由CSDN通过智能技术生成

预备知识:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值