2010-06-17 49 views
2

我正在Nucleus RTOS的移动平台上工作。它使用Nucleus线程系统,但它不支持显式线程本地存储,即TlsAlloc,TlsSetValue,TlsGetValue和TlsFree API。该平台也没有用户空间pthreads。如何在C++的用户空间模拟线程本地存储?

我发现__thread存储修饰符存在于大多数C++编译器中。但我不知道如何让它适合我的使用习惯。如何使用显式线程本地存储映射__thread关键字?我读了很多文章,但没有什么是如此清楚给我以下基本信息

  1. 将__thread变量不同的每个线程?
  2. 如何写入并从中读取?每个线程是否只有一个变量副本?

以下是基于并行线程执行:

pthread_key_t m_key; 

struct Data : Noncopyable { 
     Data(T* value, void* owner) : value(value), owner(owner) {} 


     int* value; 

    }; 


inline ThreadSpecific() 
{ 
    int error = pthread_key_create(&m_key, destroy); 
    if (error) 
     CRASH(); 
} 

inline ~ThreadSpecific() 
{ 
    pthread_key_delete(m_key); // Does not invoke destructor functions. 
} 

inline T* get() 
{ 
    Data* data = static_cast<Data*>(pthread_getspecific(m_key)); 
    return data ? data->value : 0; 
} 

inline void set(T* ptr) 
{ 
    ASSERT(!get()); 
    pthread_setspecific(m_key, new Data(ptr, this)); 
} 

如何使上面的代码使用__thread的方式来设置&得到具体的价值?何时/何时创建&删除发生?

如果这是不可能的,如何编写自定义的pthread_setspecific,pthread_getspecific类型的API。

我试过使用C++全局映射,并为每个线程唯一索引并从中检索数据。但它运作不好。

回答

1

当需要线程本地存储时,我alwasy使用了ACE库。我不知道它是否适用于您的系统。如果是这样,退房类ACE_TSS

对于__thread关键字,有一个维基百科page,它在那里描述。