首页 > 编程语言 >C++ 11 关键字:thread_local

C++ 11 关键字:thread_local

时间:2023-11-30 10:36:09浏览次数:53  
标签:11 变量 thread t2 C++ t1 local

thread_local 是 C++ 11 新引入的一种存储类型,它会影响变量的存储周期。

C++ 中有 4 种存储周期:

automatic
static
dynamic
thread

有且只有 thread_local 关键字修饰的变量具有线程(thread)周期,这些变量在线程开始的时候被生成,在线程结束的时候被销毁,并且每一个线程都拥有一个独立的变量实例。

thread_local 一般用于需要保证线程安全的函数中。

需要注意的一点是,如果类的成员函数内定义了 thread_local 变量,则对于同一个线程内的该类的多个对象都会共享一个变量实例,并且只会在第一次执行这个成员函数时初始化这个变量实例,这一点是跟类的静态成员变量类似的。

下面用一些测试样例说明:
case 1:

class A 
{
 public:
  A() {}
  ~A() {}

  void test(const std::string &name)
  {
    thread_local int count = 0;
    ++count;
    std::cout << name << ": " <<  count << std::endl;
  }
};

void func(const std::string &name) 
{
  A a1;
  a1.test(name);
  a1.test(name);
  A a2;
  a2.test(name);
  a2.test(name);
}

int main(int argc, char* argv[])
{
  std::thread t1(func, "t1");
  t1.join();
  std::thread t2(func, "t2");
  t2.join();
  return 0;
}

输出:

t1: 1
t1: 2
t1: 3
t1: 4
t2: 1
t2: 2
t2: 3
t2: 4

case 2:

class A 
{
 public:
  A() {}
  ~A() {}

  void test(const std::string &name)
  {
    static int count = 0;
    ++count;
    std::cout << name << ": " <<  count << std::endl;
  }
};

void func(const std::string &name)
{
  A a1;
  a1.test(name);
  a1.test(name);
  A a2;
  a2.test(name);
  a2.test(name);
}

int main(int argc, char* argv[]) 
{
  std::thread t1(func, "t1");
  t1.join();
  std::thread t2(func, "t2");
  t2.join();
  return 0;
}

输出:

t1: 1
t1: 2
t1: 3
t1: 4
t2: 5
t2: 6
t2: 7
t2: 8

标签:11,变量,thread,t2,C++,t1,local
From: https://www.cnblogs.com/blizzard8204/p/17866721.html

相关文章

  • 11.30
    软件设计                 石家庄铁道大学信息学院 实验25:访问者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解访问者模式的动机,掌握该模式的结构;2、能够利用访问者模式法解决实际问题。 [实验任务一]:打包员在我们课堂上的“购......
  • 【2023-11-29】过往不恋
    20:00 每个人心中总有一点恐惧,但是我们在一起就不那么害怕了。                                                 ——查理·麦克西今天是我们新项目中标的一个启动会......
  • 2023-11-30 记录实用小案例 —— react监听页面返回时执行事件
    useEffect(()=>{consthandlePageBack=()=>{//此处写你想要触发的事件};//监听浏览器的popstate事件,即页面返回事件window.addEventListener('popstate',handlePageBack);//在组件卸载时移除事件监听return()=>{......
  • 20231129
    周六应该有一位新(老)同学要来机房。gm今晚还问我我旁边的电脑是不是好的。(我空着一个电脑坐只是为了远离某个【数据删除】的人。)突然觉得和自己的经历就很像。但是这也不能说是非常相似吧。说实话挺担心这位同学是否能跟得上进度的,以及,更关键的是机房的氛围(懂的都懂(放学......
  • 2023年11月29日模拟赛
    更好的观看总结今天考模拟赛,还是很好玩的。三道题!题解这里要写题解了。怎么评价今天的题目呢?很好理解的。link。T1显然\(n\lek\)时是无穷多个。那么容易发现其余情况至少要匹配\(n-k\)个对称点。那么找到左上角和右下角的点,按照横坐标,纵坐标排序,会发现这样子会覆盖......
  • 11.29实验21
    实验21:观察者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解观察者模式的动机,掌握该模式的结构;2、能够利用观察者模式解决实际问题。[实验任务一]:股票提醒当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时......
  • 11.29实验22
    实验22:状态模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解状态模式的动机,掌握该模式的结构;2、能够利用状态模式解决实际问题。[实验任务一]:银行账户用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态......
  • 11.29实验23
    实验23:策略模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解策略模式的动机,掌握该模式的结构;2、能够利用策略模式解决实际问题。[实验任务一]:旅行方式的选择旅游的出行方式有乘坐飞机旅行、乘火车旅行和自行车游,不同的旅游方式有不同的实现过程,客户可以根据自......
  • 11 29学习内容
    今天完成内容:实验一:百度机器翻译SDK实验  任务一:下载配置百度翻译Java相关库及环境(占10%)。    任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。    任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文翻译成英文,英文翻......
  • 2023.11.29——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.百度图像增强SDK明日计划:学习......