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)

  • 相关阅读:
    【CF 547E】 Mike and Friends
    [LNR#2 D1T3] 不等关系
    [THUPC2019] 不等式
    [THUPC2019]过河卒二
    [THUPC2018] 绿绿和串串
    【IOI2018】组合动作
    229. Majority Element II My Submissions Question
    169. Majority Element My Submissions Question
    ### Caffe
    ### OpenCV安装(Linux)
  • 原文地址:https://www.cnblogs.com/tingtaishou/p/14994502.html
Copyright © 2011-2022 走看看