在此代码中:
int foo() {
static int x;
}
是每个线程中所有线程或本地的x
全局?或者这取决于编译器标志和/或编译器,所以我真的不知道代码是什么?
几个问题(所有问题都独立于编译器和编译器标志和操作系统):
我想这不是C ++本身。 (它是在C ++ 0x中吗?)一些Boost lib可以做到这一点吗?
答案 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。
- 如何创建一个全局的静态变量 线程?
- 如何创建每个静态变量 线程?
- 如何创建一个全局变量的全局变量 线程?
- 如何创建每个变量的局部变量 线程?
醇>
请注意,通常,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 ++方面我是伪程序员。 :)