gcc 4.7 em linux pthreads - solução não linear thread_local usando __thread (sem reforço)
Em C ++ 11 você pode ter um objeto não-trivial com armazenamento thread_local:
class X { ... }
void f()
{
thread_local X x = ...;
...
}
Infelizmente este recurso ainda não foi implementado no gcc (a partir de 4.7).
O gcc permite que você tenha variáveis locais de thread, mas apenas com tipos triviais.
Eu estou procurando uma solução alternativa:
Aqui está o que eu tenho até agora:
#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();
}
O que eu preciso de ajuda é chamando placement_delete_x (& x_storage) na saída do thread atual. Existe um mecanismo em pthreads e / ou linux que eu possa usar para fazer isso? Eu precisaria adicionar um ponteiro de função e um parâmetro para algum tipo de pilha de limpeza pthread?
Atualizar:
eu acho quepthread_cleanup_push
pode ser o que eu quero:
http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cleanup_push.3.html
Isso chamará o manipulador de limpeza nas circunstâncias corretas para esse uso?
Atualização 2:
Parece queboost::thread_specific_ptr
eventualmente chamapthread_key_create
com odestructor
parâmetro, e nãopthread_cleanup_push
- chamar sua função de limpeza de tls:
http://pubs.opengroup.org/onlinepubs/009696799/functions/pthread_key_create.html
Não está claro qual é a diferença entre esses dois métodos, se houver. ?