我正在基于 Nucleus RTOS 的移动平台上工作。它使用 Nucleus 线程系统,但不支持显式线程本地存储,即 TlsAlloc、TlsSetValue、TlsGetValue、TlsFree API。该平台也没有用户空间线程。
我发现大多数 C++ 编译器中都存在 __thread 存储修饰符。但我不知道如何让它适合我的用途。 __thread 关键字如何映射到显式线程本地存储?我读了很多文章,但没有什么能给我以下基本信息那么清楚
- 每个线程的 __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));
}
如何让上面的代码使用__thread的方式来设置和获取特定的值?创建和删除发生在何处/何时?
如果这不可能,如何编写自定义 pthread_setspecific、pthread_getspecific 类型的 API。
我尝试使用 C++ 全局映射并为每个线程唯一地索引它并从中检索数据。但效果不佳。
最佳答案
关于c++ - 如何在 C++ 中模拟用户空间的线程本地存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3062162/