2

我有一段 C/C++ 代码,它使用 __thread 关键字进行线程本地存储,但是在使用 g++(版本 4.0.2)的 64 位 Solaris Sparc 上编译它时遇到问题,而它在使用 g++ 的 Linux 上编译和运行正常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 thead 特定存储。它应该可以工作,而且它不是特定于 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

您可以尝试将-pthread命令行选项添加到 g++:此选项在 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 回答