2

スレッド ローカル ストレージに __thread キーワードを使用する C/C++ コードがありますが、64 ビット Solaris Sparc で g++ (バージョン 4.0.2) を使用してコンパイルするのに問題がありますが、Linux では g++ を使用してコンパイルおよび実行できます。 34コンパイラ。ソースコードの例を次に示します。

__thread int count = 0;

「g++ -dumpversion」コマンドからのコンパイラ情報は「4.0.2」を返し、「g++ -dumpmachine」は「sparc-sun-solaris2.8」を示します。「uname -a」は「SunOS devsol1 5.9 Generic_118558-26 sun4u sparc SUNW,UltraAX-i2」を表示します。

g ++でmakeを実行している間のエラーメッセージは次のとおりです:「エラー:このターゲットではスレッドローカルストレージはサポートされていません」、使用しているコンパイラオプションは

 -m64    -g -fexceptions -fPIC     -I../fincad -I/usr/java_1.6.0_12/include -I/usr/java_1.6.0_12/include/solaris -I/opt/csw/gcc4/lib/sparcv9 -I/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.0.2/sparcv9 -I. -I/usr/include -I/usr/include/iso -I/usr/local/include

私は週末にこれに苦労しており、締め切りに直面しているため、どんな助けも大歓迎です.

ありがとう、チャールズ

4

3 に答える 3

2

gcc 固有のスレッド固有のストレージを無視して、posix のスレッド固有のストレージを使用できます。それは動作するはずであり、gnu 固有ではありません。サンサイトに例があり ます。

これは、 ibmの要約された例です。明らかに、複数のスレッドを使用したいでしょう。

pthread_key_t   tlsKey = 0;

int main(int argc, char **argv)
  rc = pthread_key_create(&tlsKey, globalDestructor);
  /* The key can now be used from all threads */

  // Each thread can now use the key:
  char *myThreadDataStructure;
  void                 *global;

  myThreadDataStructure = malloc(15);//your data structure
  pthread_setspecific(tlsKey, myThreadDataStructure);   

  /* Get the data back */    

  global  = pthread_getspecific(tlsKey);


  free (myThreadDataStructure);
  rc = pthread_key_delete(tlsKey);
}
于 2010-11-08T14:29:29.817 に答える
1

コマンドライン オプションを g++ に追加してみることができ-pthreadます。このオプションは、GCC の用語で、「POSIX スレッド サポートに必要なすべてを実行する」ことを意味します。これにより、 のサポート解除される可能性があり__threadます。

スレッド ローカル ストレージで__threadは、コンパイラだけでなくリンカー (コンパイルの最後に呼び出される静的リンカーと、プログラムの実行時に呼び出される動的リンカーの両方) にも、特定のシステム サポートが必要です。特定の組み合わせ (かなり古い g++ とかなり古い Solaris) がサポートされているかどうかはわかりません (一部のグーグルでは、古い gcc [3.4.3] と新しい Solaris [10] で使用できる人もいます)。サポートされていない場合は、POSIX / Single Unix 関数pthread_key_create()pthread_setspecific()およびを使用できますpthread_getspecific()。これらは修飾子ほど遅く、便利ではありません__threadが、少なくとも機能します。

于 2010-11-08T15:11:57.097 に答える
0

Boost.Thread の thread_specific_ptr を使用して、移植可能な方法でこれを実装できます。

他に何もないとしても、それを参考にして、Solarisでこれを行う方法を考え出すことができるはずです。

于 2010-11-08T14:28:31.437 に答える