5

この文:

___thread A a;

次のエラーが生成されます。

非 POD タイプであるため、スレッド ローカルにはできません

ここで A は

class A{
       public:
               // function declaration
       private:
               // data members
};

コマンド ogs includes & ogs mk を使用して、これを Linux でコンパイルしようとしています。静的スレッドがあります。つまり、アプリケーションが入る前にスレッドの数を認識しているため、現在の回避策は A の配列を宣言することです。

A a[Number of threads].

どうすればこれを修正できますか?

4

2 に答える 2

2

を使用すると仮定するとgcc、スレッドローカルストレージはPOD型、つまりデータのみの構造に対してのみサポートされます。データを個別に抽出して、structそれをスレッド ローカルにすることができます (実際、メソッドをスレッド ローカルにすることにはあまり意味がないため、これはおそらく良い考えです)。

于 2012-11-29T18:12:30.143 に答える
1

残念ながら、C++03 にはスレッド ローカル リソースの動的な初期化 (および破棄) のようなものはありません (とにかく、スレッドについて何も知りません)。

C++11 では、thread_localstorage キーワードを使用すると、実行時のオーバーヘッド (基本的には、スレッド ローカルの静的変数を持つのと同じ) を犠牲にして動的な初期化が可能になるため、コンストラクターで型なしで使用される場合があります。

C++11 では、コンストラクターが静的初期化のために呼び出される可能性があるため、コンパイラーがそれを実装していればconstexpr、指定子と互換性があるはずです。__thread

于 2012-11-29T18:37:37.667 に答える