我有一个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();
}
这修正了动态内存分配的问题。 我只需要添加线程清理处理程序。 有没有一种机制并行线程来做到这一点?