zoukankan      html  css  js  c++  java
  • C++11多线程(thread_local)

    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.c_str() << ": " << 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");
        std::thread t2(func, "t2");
        t1.join();
        t2.join();
    
        return 0;
    }

    输出:

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

    case 2:

    class A
    {
    public:
        A() {}
        ~A() {}
    
        void test(const std::string &name)
        {
            static int count = 0;
            ++count;
            std::cout << name.c_str() << ": " << 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");
        std::thread t2(func, "t2");
        t1.join();
        t2.join();
    
        return 0;
    }

    输出:

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

    转载于:C++ 11 关键字:thread_local - 知乎 (zhihu.com)

  • 相关阅读:
    EMV/PBOC解析(三) TLV格式解析(C#)
    写自己的WPF样式
    EMV/PBOC 解析(二) 卡片数据读取
    FLEX 图片拷贝
    重学浏览器(2)-进程间的交互
    重学浏览器(1)-多进程多线程的浏览器
    实现财务自由-《富爸爸穷爸爸》读书语句摘抄
    mini-css-extract-plugin简介
    egg.js路由的优雅改造
    node中异步IO的理解
  • 原文地址:https://www.cnblogs.com/tingtaishou/p/14994502.html
Copyright © 2011-2022 走看看