【问题标题】:how to compile thread local storage (TLS) on 64-bit solaris sparc with g++如何使用 g++ 在 64 位 solaris sparc 上编译线程本地存储 (TLS)
【发布时间】:2010-11-08 14:07:21
【问题描述】:

我有一段 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

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

谢谢, 查尔斯

【问题讨论】:

标签: multithreading gcc sparc thread-local-storage


【解决方案1】:

您可以忽略 gcc 特定线程特定存储并使用 posix thead 特定存储。它应该可以工作,并且不是特定于 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);
}

【讨论】:

  • 到目前为止,它在 linux 和 solaris 64 位环境上都运行良好。像魅力一样编译。仍在等待测试完成,但看起来很有希望。附带说明一下,posix thead 特定存储在性能方面与 gnu 相比如何。在我的测试过程中我没有注意到任何戏剧性的事情,但我对这个方面很感兴趣。另一位评论者提到 thread_specific_ptr 有明显的性能损失。
  • 老实说,我从未使用过 gnu 扩展。不过我很想知道它是如何工作的。
【解决方案2】:

您可以尝试将 -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 限定符要慢一些,而且不如__thread 方便,但至少它们可以工作。

【讨论】:

    【解决方案3】:

    您可以使用thread_specific_ptr from Boost.Thread 以可移植的方式实现这一点。

    如果不出意外,您应该能够在 Solaris 上使用它作为参考来解决此问题。

    【讨论】:

    • thread_specific_ptr 与传统的 TLS(几乎与访问标准全局/静态变量一样快)相比,价格较高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多