如何使用g ++在64位solaris sparc上编译线程本地存储(TLS)

时间:2010-11-08 14:07:21

标签: multithreading gcc sparc thread-local-storage

我有一段C / C ++代码,它使用__thread关键字进行线程本地存储,但是在使用g ++(版本4.0.2)在64位Solaris Sparc上编译它时遇到问题,而它在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

任何帮助都非常感谢,因为我在周末一直在努力解决这个问题并面临最后期限。

谢谢, 查尔斯

3 个答案:

答案 0 :(得分:2)

您可以忽略特定于gcc的特定于线程的存储,并使用posix特定于该存储的存储。它应该工作,它不是特定于gnu。有一个例子 sun site

以下是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);
}

答案 1 :(得分: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限定符相比,它们有点慢,并且不太方便,但至少它们有效。

答案 2 :(得分:0)

您可以使用thread_specific_ptr from Boost.Thread以便携方式实现此功能。

如果没有别的,你应该能够在Solaris上使用它作为参考来解决如何做到这一点。