2016-06-26 2 views
0

pthreadsを有効にしている(またはしていない)人と、openmpをサポートしている人(またはそうでない人)が使用できるライブラリコードをいくつか記述しようとしています。私は本当にスレッドローカルストレージになりたいいくつかの変数を持っています。これを2回指定で任意の潜在的な害は冗長な__threadとompのスレッドローカル宣言

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

は、私は、これは最近で私のシステム(Debianの上で動作します知っている

(TLSプレフィックスを把握するには、ビジネスがHow to declare a variable as thread local portably?から取られる)例えば

、そこにありますこれらのコンパイラ固有の宣言は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