代码之家  ›  专栏  ›  技术社区  ›  vprajan

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

  •  2
  • vprajan  · 技术社区  · 15 年前

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

    我发现在大多数C++编译器中存在着一个线程存储修改器。但我不知道如何让它适合我的习惯。如何用显式线程本地存储映射\uu thread关键字?我读了很多文章,但没有什么是如此明确的给我以下基本信息

    1. 如何书写和阅读?每个线程是否正好有一个变量的副本?

    以下是基于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。

    1 回复  |  直到 15 年前
        1
  •  1
  •   jopa    15 年前

    我一直在用 ACE ACE_TSS

    __thread 关键字,有一个维基百科 page ,其中描述了。

    推荐文章