在 C++11 中,您可以拥有一个带有 thread_local 存储的重要对象:
class X { ... }
void f()
{
thread_local X x = ...;
...
}
不幸的是,这个特性还没有在 gcc 中实现(从 4.7 开始)。
gcc 确实允许您拥有线程局部变量,但仅限于普通类型。
我正在寻找一种解决方法:
这是我到目前为止所拥有的:
#include <iostream>
#include <type_traits>
using namespace std;
class X
{
public:
X() { cout << "X::X()" << endl; };
~X() { cout << "X::~X()" << endl; }
};
typedef aligned_storage<sizeof(X), alignment_of<X>::value>::type XStorage;
inline void placement_delete_x(X* p) { p->~X(); }
void f()
{
static __thread bool x_allocated = false;
static __thread XStorage x_storage;
if (!x_allocated)
{
new (&x_storage) X;
x_allocated = true;
// TODO: add thread cleanup that
// calls placement_delete_x(&x_storage)
}
X& x = *((X*) &x_storage);
}
int main()
{
f();
}
我需要帮助的是在当前线程退出时调用placement_delete_x(&x_storage)。我可以使用 pthreads 和/或 linux 中的机制来执行此操作吗?我需要向某种 pthread 清理堆栈添加函数指针和参数吗?
更新:
我想pthread_cleanup_push
可能是我想要的:
http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cleanup_push.3.html
这会在正确的情况下调用清理处理程序吗?
更新 2:
看起来boost::thread_specific_ptr
最终pthread_key_create
使用destructor
参数调用,而不是pthread_cleanup_push
- 调用它的 tls 清理函数:
http://pubs.opengroup.org/onlinepubs/009696799/functions/pthread_key_create.html
目前尚不清楚这两种方法之间的区别是什么,如果有的话。?