Я пытаюсь написать некоторый код библиотеки, который может использоваться людьми, у которых есть 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.
Почему вы не впервые проверяете стандарт C, а затем на расширения компилятора? – Olaf
@Olaf Я просто соответствовал тому, как это было предложено в другом вопросе SO, с которым я связан. Во всяком случае, я не думаю, что это важно для целей вопроса, который я задаю здесь. –
Ну, не следуйте схеме, если вы не знаете, что она делает. Как правило, плохой дизайн использует расширения, если эта функция предоставляется стандартом. Всегда используйте самый общий способ. – Olaf