thread_local 本地存储

示例代码:

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

mutex m;

thread_local int local_num = 1;

int g_n = 100;

void addLocal()
{
    local_num += 10;
    lock_guard<mutex> g( m ); //避免输出混乱
    cout << "id=" << this_thread::get_id() << ",num=" << local_num << endl;
}

void addShare()
{
    g_n += 10;
    lock_guard<mutex> g( m ); //避免输出混乱
    cout << "id=" << this_thread::get_id() << ",num=" << g_n << endl;
}

void func()
{
    thread_local int i = 0;
    cout << "i=" << i << endl;
    ++i;
}
int main()
{
    cout << "测试thread_local使用:\n";
    thread t1( addLocal );
    thread t2( addLocal );
    t1.join();
    t2.join();

    cout << "\n测试普通变量使用:\n";
    thread t3( addShare );
    thread t4( addShare );
    t3.join();
    t4.join();

    cout << "\n测试thread_local生命周期:\n";
    func();
    func();
    system( "pause" );
    return 0;
}

 

知识点总结:

1、对于普通的全局变量来说,所有线程共享一个副本(有效作用域内)

2、对于 thread_local 来说,每个线程对应自己的一个副本,互不影响

3、thread_local 具有 static 一样的初始化和生命周期特性,只初始化一次生命周期与线程周期绑定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值