【发布时间】:2012-08-16 10:59:52
【问题描述】:
我有一个 X 课:
class X { ... }
我想这样做:
void f()
{
thread_local static X x = ...;
...
}
(其实我用的是gcc所以关键字是“__thread”)
但我不能,因为你只能拥有微不足道的 thread_locals。
最好的解决方法是什么?
如果我这样做:
void f()
{
thread_local static X* p = 0;
if (!p)
p = new X(...);
X& x = *p;
...
}
然后:
- 线程退出时不会调用析构函数
- 不必要的动态内存分配。
更新:
这是我目前所拥有的:
#include <iostream>
#include <type_traits>
using namespace std;
class X { public: X() { cout << "X::X()" << endl; }; ~X() { cout << "X::~X()" << endl; } };
void f()
{
static __thread bool x_allocated = false;
static __thread aligned_storage<sizeof(X),
alignment_of<X>::value>::type x_storage;
if (!x_allocated)
{
new (&x_storage) X;
x_allocated = true;
// add thread cleanup that calls destructor
}
X& x = *((X*) &x_storage);
}
int main()
{
f();
}
这解决了动态内存分配问题。我只需要添加线程清理处理程序。有没有一种机制可以用 pthreads 做到这一点?
【问题讨论】:
-
为什么你只能有微不足道的线程局部变量?标准杆?
-
我是这么认为的? GCC 似乎不喜欢它。
-
@ForEveR 我认为标准没有这样的限制,而且GCC还没有实现C++11线程本地存储。
-
@juanchopanza: gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Thread_002dLocal.html
-
这是一个 gcc 扩展,而不是 C++11
thread_local。见here。因此,无论何时实施,您都不会遇到琐碎问题。
标签: c++ multithreading c++11 thread-local thread-local-storage