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

时间:2010-09-03 15:34:17

标签: c++ multithreading variables static

在此代码中:

int foo() {
   static int x;
}

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

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

  1. 如何创建一个对所有线程都是全局的静态变量?
  2. 如何创建每个线程本地的静态变量?
  3. 如何创建一个对所有线程都是全局的全局变量?
  4. 如何创建每个线程本地的全局变量?
  5. 我想这不是C ++本身。 (它是在C ++ 0x中吗?)一些Boost lib可以做到这一点吗?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

快速部分答案;

  

(它是在C ++ 0x中吗?)

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

  

一些Boost lib可以做到这一点吗?

Boost.Threads。请参阅其中的thread local storage

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

请注意,通常,static指的是duration,global指的是scope。

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();
}

答案 2 :(得分:1)

你必须使用某种跨平台的线程库(因为你提到了OS独立性),但是你可以使用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 ++方面我是伪程序员。 :)