2010-09-03 141 views
8

C++:如何在这个代码中创建线程局部/全局变量

int foo() { 
    static int x; 
} 

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

的几个问题(它们都独立于编译器和编译器标志和OS):

  1. 如何创建一个静态变量,这是全球的所有主题?
  2. 如何创建一个静态变量,它是每个线程本地的?
  3. 如何创建一个对所有线程全局的全局变量?
  4. 如何创建一个全局变量,它是每个线程本地的?

我想这不是在C++本身。 (它在C++ 0x?)一些Boost库可以做到这一点?

回答

6

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

+1

为避免混淆,最好将即将推出的版本称为C++ 0x,尽管它在2010年之前尚未完成.C++ 1x是此后版本的非官方名称,可能是在2020年之前完成。 – 2010-09-03 15:59:11

+0

嗯,虽然我已经看到C++ 1x的含义是指C++ 10或C++ 11,但它是有道理的。你有没有讨论这个命名的任何链接,并试图达成共识? – usta 2010-09-03 16:14:38

+0

共识和C++混合不好,下一个标准被称为C++ 0x,并且中途改变它的名字并不真正起作用,特别是因为Bjarne和其他一些人宣称他们只需要5年C++ 0x和C++ 1x因为行业运行速度很快,所以他们建议下次做更少的更改,以保持截止日期。 – 2010-09-03 16:22:23

1

快速部分回答;

(它是C++ 0x中?)

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

一些可以做到这一点的Boost库?

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

你不得不使用某种跨平台线程库(因为你提到了操作系统的独立性),但是你可以使用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++应该被视为伪代码,因为我是一个伪程序员。 :)

+0

请注意,您的代码不是线程安全的,所以需要一些额外的处理。 :)然后,这将是以安全和跨平台的方式实施它的方式。但是这也是非常低效的。每个访问需要O(log n)(n是线程数量)。在其他解决方案中,您只需要O(1)访问时间。 – Albert 2010-09-03 17:22:41

+0

随着一些pthreads信号量的增加,代码仍低于20行。使用全局变量代替依赖注入的代码无论如何都不可能是快速的或者写得很好,无论是否有树中的查找开销。 – Novikov 2010-09-03 17:47:30

+0

让线程堆栈中的变量和访问它是一个非常快速的操作。这是一个简单的O(1)访问,它不需要任何锁定/解锁/同步。后者会产生巨大的影响。这基本上就是你想要拥有线程局部变量的主要原因。 – Albert 2010-09-03 18:38:58