我有一个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;
...
}
then:
- 线程退出时不会调用析构函数
- 不必要的动态内存分配。
Update:
这是我到目前为止所拥有的:
#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();
}
这解决了动态内存分配问题。我只需要添加线程清理处理程序。有没有一种机制可以用 pthread 来做到这一点?
该标准描述了thread_local
像其他一样作为存储说明符(static
, extern
等)见§7.1.1。该词的任何定义都没有对“简单”数据类型的限制。
该问题在C++11 之前的讨论文档 N2147 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2147.html(参见“线程变量动态初始化”一节)。其中包括对正确实施中涉及的关键问题的描述。显然 GCC 实施(static __thread
)还没有解决这些问题(这与GCC没有正式支持C++11的事实是一致的)thread_local
).
一种替代方案是boost::thread_specfic_ptr<>
提及在之前的这篇文章中 https://stackoverflow.com/a/9149029/777186并描述了here http://www.boost.org/doc/libs/1_34_1/doc/html/boost/thread_specific_ptr.html.
另一种选择是使用std::thread
对象来实现线程并确保每个实例维护自己的变量副本,可能包装在unique_ptr
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)