2
我正在Nucleus RTOS的移动平台上工作。它使用Nucleus线程系统,但它不支持显式线程本地存储,即TlsAlloc,TlsSetValue,TlsGetValue和TlsFree API。该平台也没有用户空间pthreads。如何在C++的用户空间模拟线程本地存储?
我发现__thread存储修饰符存在于大多数C++编译器中。但我不知道如何让它适合我的使用习惯。如何使用显式线程本地存储映射__thread关键字?我读了很多文章,但没有什么是如此清楚给我以下基本信息
- 将__thread变量不同的每个线程?
- 如何写入并从中读取?每个线程是否只有一个变量副本?
以下是基于并行线程执行:
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++全局映射,并为每个线程唯一索引并从中检索数据。但它运作不好。