Локальное хранилище потока (TLS) - ошибка компилятора - PullRequest
2 голосов
/ 18 мая 2011

Я объявил переменную:

static __thread int a;

Я получаю следующую ошибку:

фатальная ошибка (dcc: 1796): __thread не поддерживается в указанной целевой среде

Как я могу решить это? Должен ли я включить некоторые флаги в make-файле?

Я нахожусь на компиляторе Windriver (компилирование для powerpc). Я ссылался на подобные вопросы, но не смог понять.

По сути, я пытаюсь сделать функции входа. Любое предложение будет очень полезно.

Могу ли я что-нибудь включить, включая pthread.h?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

__ thread - это расширение gcc, которое работает не на всех платформах. Как упоминалось выше, вы можете использовать pthread_setspecific / pthread_getspecific, есть пример из man:

          /* Key for the thread-specific buffer */
          static pthread_key_t buffer_key;

          /* Once-only initialisation of the key */
          static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;

          /* Allocate the thread-specific buffer */
          void buffer_alloc(void)
          {
            pthread_once(&buffer_key_once, buffer_key_alloc);
            pthread_setspecific(buffer_key, malloc(100));
          }

          /* Return the thread-specific buffer */
          char * get_buffer(void)
          {
            return (char *) pthread_getspecific(buffer_key);
          }

          /* Allocate the key */
          static void buffer_key_alloc()
          {
            pthread_key_create(&buffer_key, buffer_destroy);
          }

          /* Free the thread-specific buffer */
          static void buffer_destroy(void * buf)
          {
            free(buf);
          }

Но, как я вижу, вы пытаетесь создать реентерабельные функции, реентерабельная функция не должна содержать статические непостоянные данные.

2 голосов
/ 18 мая 2011

__thread является расширением. Интерфейсы потоков POSIX для выполнения подобных задач: pthread_getspecific и pthread_setspecific

...