2010-06-17 2 views
2

Я работаю над мобильной платформой через Nucleus RTOS. Он использует систему Nucleus Threading, но не поддерживает явное локальное хранилище потоков i.e, TlsAlloc, TlsSetValue, TlsGetValue, TlsFree API. Платформа также не имеет pthreads пространства пользователя.Как эмулировать локальное хранилище потоков в пользовательском пространстве на C++?

Я обнаружил, что модификатор хранения __thread присутствует в большинстве компиляторов C++. Но я не знаю, как заставить его работать для моего вида использования. Как можно сопоставить ключевое слово __thread с явным локальным хранилищем потоков? Я прочитал много статей, но ничего не ясно для того, чтобы дать мне следующую базовую информацию.

  1. будет переменной переменной __thread для каждой нити?
  2. Как написать на это и прочитать его? каждый поток имеет ровно одну копию переменной?

Ниже потоковой реализации на основе:

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++ и однозначно индексировал ее для каждого потока и извлекал данные из него. Но это не сработало.

ответ

1

Я alwasy использовал библиотеку ACE при необходимости нить локальное хранилище. Я не знаю, доступна ли она для вашей системы. Если да, проверьте класс ACE_TSS.

Для ключевого слова __thread есть википедия page, где описано.

Смежные вопросы