2016-06-26 8 views
0

Я пытаюсь написать некоторый код библиотеки, который может использоваться людьми, у которых есть pthreads (или нет), и людьми, у которых есть поддержка openmp (или нет). У меня есть переменная, которую я действительно хочу быть в потоковом локальном хранилище. Есть ли потенциальный вред в определении этого дважды, напримерРезервное объявление __thread и omp threadlocal

#ifdef __GNUC__ 
# define PREFIX __thread 
#elif __STDC_VERSION__ >= 201112L 
# define PREFIX _Thread_local 
#elif defined(_MSC_VER) 
# define PREFIX __declspec(thread) 
#else 
# define PREFIX 
#endif 

PREFIX int var = 10; 
#pragma omp threadprivate(var) 

(Примечания, бизнес, чтобы выяснить префикс TLS берутся из How to declare a variable as thread local portably?)

Я знаю, что это работает на моей системе (Debian с недавним gcc), но трудно понять, могут ли все происходить неправильно в другом месте, поскольку эти объявления, специфичные для компилятора, не являются частью стандарта OpenMP.

+0

Почему вы не впервые проверяете стандарт C, а затем на расширения компилятора? – Olaf

+0

@Olaf Я просто соответствовал тому, как это было предложено в другом вопросе SO, с которым я связан. Во всяком случае, я не думаю, что это важно для целей вопроса, который я задаю здесь. –

+0

Ну, не следуйте схеме, если вы не знаете, что она делает. Как правило, плохой дизайн использует расширения, если эта функция предоставляется стандартом. Всегда используйте самый общий способ. – Olaf

ответ

1

насчет:

#if __STDC_VERSION__ >= 201112L 
# define PREFIX _Thread_local 
#elif defined(__GNUC__) 
# define PREFIX __thread 
#elif defined(_MSC_VER) 
# define PREFIX __declspec(thread) 
#else 
# define PREFIX 
#endif 

PREFIX int var = 10; 
#if !PREFIX 
#ifdef _OPENMP 
#pragma omp threadprivate(var) 
#else 
#error "Failure to put variable into TLS" 
#endif 
#endif 

GCC не возражает против чрезмерного указания, потому что __thread неявное #pragma omp threadprivate в любом случае.

Вместо того, чтобы беспокоиться о компиляторах, где это может быть не так, используйте OpenMP threadprivate условно.

+0

Последний раз, когда я проверил 'musl', он не работал с' gomp'. поэтому, если OP использует стандартную библиотеку, отличную от 'glibc', OpenMP может быть недоступна. –

+0

Спасибо, но я спрашивал больше о том, есть ли что-то неправильное с двойным определением, а не с тем, чтобы избежать его с помощью более препроцессорных директив. –

+0

@ DanRoche Я боюсь, для этого нет определенного ответа. В этом случае не указывается, что должно произойти. Лучше всего это избежать. – a3f

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

  • Нет связанных вопросов^_^