#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
, прежде чем создавать какой-либо из ваших потоков.