c++ - 如何在 C++ 中模拟用户空间的线程本地存储?

标签 c++ multithreading pthreads ssl

我正在基于 Nucleus RTOS 的移动平台上工作。它使用 Nucleus 线程系统,但不支持显式线程本地存储,即 TlsAlloc、TlsSetValue、TlsGetValue、TlsFree API。该平台也没有用户空间线程。

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

  1. 每个线程的 __thread 变量是否不同?
  2. 如何写入和读取它?每个线程是否只有一份变量拷贝?

以下是基于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++ 全局映射并为每个线程唯一地索引它并从中检索数据。但效果不佳。

最佳答案

我一直使用 ACE需要线程本地存储时的库。我不知道它是否适用于您的系统。如果是这样,请查看类(class) ACE_TSS .

对于__thread关键字,有一个维基百科page ,它被描述的地方。

关于c++ - 如何在 C++ 中模拟用户空间的线程本地存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3062162/

相关文章:

c++ - 具有特征类型输出的特征二进制表达式

c++ - 使用并行线程的矩阵乘法

c++ - Qt 信号/槽和线程

c++ - 另一个线程安全队列实现

c - 一个进程中放置多少个线程

c++ - 写入以 boost 共享内存

c++ - 在 0f 10^30 范围内进行计算

c++ - 与 Qt 第三方库的静态链接

java - SwingWorker 的基本原理是什么?

c - 从 pthread 运行 pthreads