我正在Nucleus RTOS上的移动平台上工作。它使用Nucleus线程系统,但不支持显式线程本地存储,即TlsAlloc、TlsSetValue、TlsGetValue、tlsfreeapi。平台也没有用户空间pthreads。
我发现在大多数C++编译器中存在着一个线程存储修改器。但我不知道如何让它适合我的习惯。如何用显式线程本地存储映射\uu thread关键字?我读了很多文章,但没有什么是如此明确的给我以下基本信息
-
-
如何书写和阅读?每个线程是否正好有一个变量的副本?
以下是基于pthread的实现:
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));
}
如何使上述代码使用线程方式设置(&U);获取特定值?在何处/何时创建;删除发生了什么?
如果这是不可能的,如何编写自定义pthread\u setspecific,pthread\u getspecific类api。