代码之家  ›  专栏  ›  技术社区  ›  Albert

C++:如何创建线程本地/全局变量

  •  8
  • Albert  · 技术社区  · 15 年前

    在本代码中:

    int foo() {
       static int x;
    }
    

    x 全局到所有线程还是每个线程中的本地?或者这取决于编译器标志和/或编译器,所以我不能真正知道代码中的代码是什么?

    几个问题(所有问题都独立于编译器和编译器标志和操作系统):

    1. 如何创建对所有线程都是全局的静态变量?
    2. 如何创建每个线程局部的静态变量?
    3. 如何创建对所有线程都是全局的全局变量?
    4. 如何创建每个线程的局部全局变量?

    我猜这不是C++本身。(在C++ 0x中吗?)一些可以做到这一点的boost lib?

    3 回复  |  直到 13 年前
        1
  •  6
  •   Andrew Tomazos    13 年前

    X对所有线程都是全局的。始终独立于编译器和/或其标志。独立于这是C++ 11还是C++ 03。因此,如果您声明一个常规的全局或静态局部变量,它将在所有线程之间共享。 在C++ 11中,我们将得到 thread_local 关键字。在此之前,您可以使用boost.thread中的特定于线程的指针。

        2
  •  1
  •   dirkgently    15 年前

    快速部分回答;

    (在C++ 0x中吗?)

    对。但也取决于编译器的C++ 0x支持。

    一些可以做到这一点的boost lib?

    Boost.Threads . 见 thread local storage 其中。

    1. 如何创建全局的静态变量 线程?
    2. 如何创建一个静态变量 线程?
    3. 如何创建全局变量 线程?
    4. 如何创建一个局部的全局变量 线程?

    注意,通常,静态是指持续时间,全局是指范围。

    C++0x线程构造函数是可变的:可以传递任意数量(和类型)的参数。所有这些对您的 std::thread 对象。

    #include <thread>
    
    int main()
    {
        int foo = 42;
        std::thread t(foo); // copies foo
        std::thread s(&foo); // pass a pointer
        t.join();
    }
    
        3
  •  1
  •   Novikov    15 年前

    您必须使用某种跨平台线程库(因为您提到了操作系统独立性),但是考虑到pthreads,您可以这样做。

    template <T>
    class myVarStorage
    {
        static std::map<int, T> store_;
    public:
        myVarStorage();
        T getVar();
        void setVar(T);
    }
    
    template <T> void myVarStorage::setVar<T>(T var)
    {
         store_[static_cast<int>pthread_self()] = var;
    }
    
    template <T> T myVarStorage::getVar()
    {
         return store_[static_cast<int>pthread_self()]; //throws exception 
    }
    

    我确信代码中有错误,应该被当作伪代码,因为在C++时我是一个伪程序员。:)