Локальное хранилище потока (TLS) — ошибка компилятора

#c #multithreading #pthreads #powerpc

#c #многопоточность #pthreads #powerpc

Вопрос:

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

static __thread int a;

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

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

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

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

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

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

Спасибо.

Комментарии:

1. Можете ли вы подробнее рассказать о своих требованиях к повторному входу?

Ответ №1:

__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(amp;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(amp;buffer_key, buffer_destroy);
          }

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

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

Комментарии:

1. Откуда вы знаете, что OP нуждается в повторном входе? Действительно, pthread_once не является реентерабельным, но это не имеет значения, если вы не собираетесь вызывать этот код из обработчика сигналов, и даже тогда вы могли бы сделать его неактуальным.

2. Виноват, почему-то я пропустил эту строчку. Тем не менее, я бы задался вопросом, действительно ли OP хочет повторного входа. Многие люди неправильно используют это слово для обозначения потокобезопасности.

3. Спасибо за предложения. Я попробую. На самом деле у меня есть код, который не является повторным вводом. Мне нужно преобразовать то же самое в re-entrant как можно короче. У меня действительно есть некоторые статические переменные области видимости файла. Следовательно, я хочу, чтобы у них были отдельные адреса, когда к ним обращаются разные потоки. Это то, чего я хочу .. и я надеюсь, что это и есть повторный вход.

Ответ №2:

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

Комментарии:

1. Спасибо. В моем случае можете ли вы показать мне простой пример? Все, что я ищу по этому поводу, слишком сложно, поскольку я использую это впервые.

2. @kartik, tvn в основном показывает вам, как это работает. Но все это, вероятно, не такая уж хорошая идея, если вы действительно хотите повторно подключиться. Вам пришлось бы выполнить pthread_key_create где-нибудь в main , прежде чем создавать какой-либо из ваших потоков.