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

我有一段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时出现错误消息:“error:此目标不支持线程本地存储”,我使用的编译器选项是
 -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
我非常感谢任何帮助,因为我在周末一直在努力解决这个问题并面临最后期限。 谢谢, 查尔斯     
已邀请:
您可以忽略特定于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);
}
    
您可以尝试将
-pthread
命令行选项添加到g ++:这个选项意味着,用GCC的说法:“执行POSIX线程支持所需的一切”。这可能会解锁对ѭ4的支持。 带有
__thread
的线程本地存储需要一些特定的系统支持,在编译器中,也需要在链接器中(在编译结束时调用静态链接器,在执行程序时调用动态链接器)。我不知道你是否支持你的特定组合(一个相当古老的g ++与一个相当老的Solaris)(一些谷歌搜索告诉我,有些人可以使用旧的gcc [3.4.3]和更新的Solaris [10])。如果不支持,可以使用POSIX / Single Unix功能
pthread_key_create()
pthread_setspecific()
pthread_getspecific()
。它们有点慢,并不像
__thread
限定符那么方便,但至少它们起作用。     
您可以使用Boost.Thread中的thread_specific_ptr以便携方式实现此功能。 如果不出意外,您应该能够在Solaris上使用它作为参考来解决如何执行此操作的问题。     

要回复问题请先登录注册