2012-06-12 12 views
18

このようにします。クラスまたは構造体内でスレッドローカル変数を使用できますか?

struct some_struct 
{ 
// Other fields 
..... 
__thread int tl; 
} 

私はそれをやろうとしていますが、コンパイラが私にこのエラーを与えています。

./cv.h:16:2: error: '__thread' is only allowed on variable declarations 
     __thread int tl; 
+1

__thread int tl;を変更する必要があります。 –

+0

AFAICSは '__thread'は標準ではありません。どのコンパイラを使用していますか? –

答えて

12

スレッドローカルストレージは、静的変数にのみ適用されます。静的でない構造体やクラスメンバをスレッドローカルにすることには意味がありません。

ローカル(自動)変数は常にコードを実行するスレッドに固有ですが、グローバル変数と静的変数はデータまたはBSSセグメントに存在するためスレッド間で共有されます。 TLSは、グローバル変数をスレッドのローカルにするためのメカニズムを提供します。つまり、__threadキーワードが達成するものです。つまり、スレッドごとに変数のコピーを作成するようコンパイラに指示します。同じ実行スレッド内で呼び出される異なる関数)。自動変数が宣言されている場合、スタック上のいずれか、またはヒープでnew又はmalloc()が使用される場合 -

非静的クラスメンバーと構造部材は、オブジェクト(クラスまたは構造)が割り当てられている同じ場所に配置されます。どちらの方法でも、各スレッドは変数の一意の格納場所を受け取り、__threadはこの場合は適用されないため、コンパイラエラーが発生します。

+6

__threadまたはthread_localの現在の意味ではありませんが、各スレッドごとに異なるメンバを持つことが理にかなっていて、いくつかのインターフェイスの後ろに素早くラップアップされている状況がかなりあります。 – PlasmaHH

+9

私は同意しなければなりません。オブジェクトが単一のスレッドによって作成されているからといって、それが1つのスレッド(ロックフリーのデータ構造など)によってのみ操作されるわけではありません。確かに、これは比較的まれです。 – Cameron

+0

私は下級者のいずれかがコントラ・サンプルやより良い答えを投稿したり、質問を編集したり質問を編集する方法について提案したりすることに気を配っています。 –

6

gcc__threadの使用について以下restrictionsを課す:

__thread指定子は、任意のグローバル、ファイルスコープの静的、関数スコープの静的、または静的データメンバに適用することができますクラス。ブロックスコープの自動または非静的データメンバーには適用されない可能性があります。

__thread修飾子は複数のコンパイラでサポートされています。正確な制限は、コンパイラによって多少異なる場合はありません。

0

以前のPetzoldの書籍「Programming Windows」(1241ページ)によれば、キーワードは__declspec(スレッド)を使用して変数をスレッドローカルとしてマークしています。 したがって、例: __declspec(スレッド)int iGlobal = 1;

私はこれがクラスでもできるとは思わない。変数を静的にすることもできます。 ちょうどあなたがおそらく窓で走っていないことに気が付いた。だから、窓の答えが必要な人はこれが関係するかもしれないと思う。

4

C11標準6.7.1項2

最大で、一つのストレージクラス指定子は_Thread_localが静的またはEXTERNと見えることを除いて、 宣言で宣言指定子で与えられてもよいです。 120)

C11標準セクション6.7。ブロックスコープを持つオブジェクトの宣言で1項3

宣言指定子は _Thread_localを含む場合、それらは、静的またはEXTERNのいずれかを含むものとします。 _Thread_localは、オブジェクトの任意の宣言に表示された場合、そのオブジェクトのすべての 宣言に存在しなければなりません。

+1

私はあなたがいない、C11を意味すると思いますか? C99にはスレッドモデルとそのすべてがありませんでした。 –

+0

修正しました。 C99を書く習慣。 – phoxis

0

これはあまり意味がありません。static(=グローバル)メンバーはC++の機能です。そしてそう(_Thread_localを紹介します)新しいC11標準はそれを許可していません。これらの獣は基本的にどこでも静的な記憶期間を持つ変数が許されています。

は、C++の場合、これはstaticメンバーに類似したとして、クラス内での意味を作ることができるが、これはC++ 11で許可されている場合、私は考えています。

+0

それは許可されていないようですが、私はVS2015でC2720を取得しました:https://msdn.microsoft.com/en-us/library/w8x1t4f0.aspx –

1

あなたが取得しているコンパイラエラーを投稿してくださいthread_local static int tl;

+1

次に、異なる値を持つstruct/classのインスタンスを複数持つことはできません。このフィールド。 – rustyx

関連する問題