2016-06-26 5 views
0

Ich versuche, etwas Bibliothekscode zu schreiben, der von Leuten benutzt werden kann, die Pthreads aktiviert haben (oder nicht), und von Leuten, die openmp Unterstützung haben (oder nicht). Ich habe eine Variable, die ich wirklich im thread-lokalen Speicher sein möchte. Gibt es einen möglichen Schaden dies zweimal in spezifizieren, zum BeispielRedundante __thread und omp threadlokale Deklaration

#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) 

(Hinweis: das Geschäft des TLS-Präfix, um herauszufinden, aus How to declare a variable as thread local portably? genommen)

Ich weiß, das funktioniert auf meinem System (Debian mit dem letzten gcc), aber es ist schwer zu wissen, ob etwas anders schief gehen könnte, da diese Compiler-spezifischen Deklarationen nicht Teil des OpenMP-Standards sind.

+0

Warum suchen Sie nicht zuerst nach dem C-Standard, dann nach Compiler-Erweiterungen? – Olaf

+0

@Olaf Ich passte einfach so, wie es in der anderen SO-Frage vorgeschlagen wurde, die ich verlinkt hatte. Jedenfalls glaube ich nicht, dass es für die Frage, die ich hier stelle, wichtig ist. –

+0

Nun, folgen Sie nicht einem Muster, wenn Sie nicht wissen, was es tut. Es ist im Allgemeinen schlecht, Erweiterungen zu verwenden, wenn eine Funktion vom Standard bereitgestellt wird. Benutze immer zuerst den allgemeinsten Weg. – Olaf

Antwort

1

Was:

#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 nicht die Über Angabe hat nichts dagegen, weil __thread eine implizite #pragma omp threadprivate sowieso.

Anstatt sich über Compiler Gedanken zu machen, wo dies nicht der Fall ist, verwenden Sie einfach OpenMP's threadprivate bedingt.

+0

Das letzte Mal, als ich überprüft habe 'musl' hat nicht mit' gomp' funktioniert. Wenn das OP also eine andere Standardbibliothek als 'glibc' verwendet, ist OpenMP möglicherweise nicht verfügbar. –

+0

Danke, aber ich fragte mehr darüber, ob etwas falsch ist mit der doppelten Angabe, anstatt eine Möglichkeit, es mit mehr Präprozessordirektiven zu vermeiden. –

+0

@DanRoche Ich fürchte, es gibt keine definitive Antwort dafür. Es wird nirgends angegeben, was in einem solchen Fall passieren soll. Am besten ist es, es zu vermeiden. – a3f