このような。
struct some_struct
{
// Other fields
.....
__thread int tl;
}
私はそれをやろうとしていますが、コンパイラがこのエラーを出しています。
./cv.h:16:2: error: '__thread' is only allowed on variable declarations
__thread int tl;
このような。
struct some_struct
{
// Other fields
.....
__thread int tl;
}
私はそれをやろうとしていますが、コンパイラがこのエラーを出しています。
./cv.h:16:2: error: '__thread' is only allowed on variable declarations
__thread int tl;
C および C++ では、スレッド ローカル ストレージは、静的変数または外部リンケージを持つ変数のみに適用されます。
ローカル (自動) 変数は通常スタック上に作成されるため、コードを実行するスレッドに固有ですが、グローバル変数と静的変数はデータまたは BSS セグメントに存在するため、すべてのスレッド間で共有されます。TLS は、これらのグローバル変数をスレッドに対してローカルにするメカニズムを提供します。これが__thread
キーワードによって達成されることです。これは、語彙的にはグローバル変数または静的変数のままでありながら、各スレッドで変数の個別のコピーを作成するようコンパイラに指示します (たとえば、同じ実行スレッド内で呼び出された異なる関数によってアクセスされます)。
非静的クラス メンバーと構造体メンバーは、オブジェクト (クラスまたは構造体) が割り当てられている場所 (自動変数が宣言されている場合はスタック上、new
または またはmalloc()
が使用されている場合はヒープ上) に配置されます。いずれにせよ、各スレッドは変数の一意の格納場所を受け取り、__thread
この場合は適用できないため、コンパイラ エラーが発生します。
gcc
の使用には次の制限__thread
があります。
指定子は、クラスの
__thread
任意のグローバル、ファイル スコープの静的、関数スコープの静的、または静的データ メンバーに適用できます。ブロック スコープの自動または非静的データ メンバーには適用されない場合があります。
__thread
修飾子は複数のコンパイラでサポートされています。正確な制限がコンパイラごとに多少異なることは考えられません。
あなたはに変更する必要があり__thread int tl;
ますthread_local static int tl;
C11 規格セクション 6.7.1 パラグラフ 2
_Thread_local が static または extern と一緒に現れる場合を除いて、宣言の宣言指定子で最大 1 つのストレージ クラス指定子を指定できます。120)
C11 規格セクション 6.7.1 パラグラフ 3
ブロック スコープを持つオブジェクトの宣言では、宣言指定子に _Thread_local が含まれる場合、static または extern も含まれます。_Thread_local がオブジェクトの宣言にある場合、そのオブジェクトのすべての宣言に存在する必要があります。
Petzold の古い本 'Programming Windows' (page 1241) によると、キーワード __declspec (スレッド) を使用して、変数をスレッド ローカルとしてマークします。例えば: __declspec (thread) int iGlobal = 1;
ただし、これがクラスで実行できるとは思えません。変数を静的にすることもできます。[編集]おそらくWindowsで実行していないことに気づきました...したがって、Windowsの回答が必要な人にとっては、これが関連している可能性があります。
C の場合、これはあまり意味がありません。static
(= グローバル) メンバーは C++ の機能にすぎません。そのため、新しい C11 標準 (導入_Thread_local
) ではそれが許可されていません。これらの野獣は基本的に、静的ストレージ期間を持つ変数が許可されているすべての場所で許可されます。
C++ の場合、これはメンバーに類似したクラス内で意味を成す可能性がありますstatic
が、これが C++11 で許可されているかどうかはわかりません。
thread_local
C++ のクラスまたは構造体のstatic
メンバーに使用できます。
struct some_struct
{
// Other fields
.....
thread_local static int tl;
}
これで問題ないはずです。そのsome_struct::tl
ため、異なるスレッドで異なる値を持つことができます。定義したい場合は、thread_local
再度追加する必要があります。
thread_local int some_struct::tl = 10;