2010-11-08 56 views
2

我有一段C/C++代码,它将__thread关键字用于线程本地存储,但无法在64位Solaris Sparc上进行编译g ++(版本4.0.2),而它编译并在g ++ 34编译器上运行linux。下面是源代码的示例:如何使用g ++编译64位solaris sparc上的线程本地存储(TLS)

__thread int count = 0; 

编译器信息从 '克++ -dumpversion' 命令返回 '4.0.2' 和 'G ++ -dumpmachine' 节目 'Sun SPARC的-solaris2.8'。 'uname -a'显示'SunOS devsol1 5.9 Generic_118558-26 sun4u sparc SUNW,UltraAX-i2'。

的错误信息,同时运行使与G ++是:“错误:线程局部不支持此目标存储”,以及编译器选项我使用的是

-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 

任何帮助是非常赞赏,因为我在周末一直在苦苦挣扎,并且正面临期限。

感谢, 查尔斯

+0

确实http://www.opengroup.org/onlinepubs/009695399/functions/pthread_setspecific.html工作? – Anycorn 2010-11-08 14:25:34

回答

0

你可以使用thread_specific_ptr from Boost.Thread便携的方式实现这一点。

如果没有其他的东西,你应该能够解决如何在Solaris上使用它作为参考。

+0

''thread_specific_ptr'与传统的TLS(这几乎和访问标准的全局/静态变量一样快)相比,具有很高的价格标签。 – valdo 2010-11-08 14:38:20

2

您可以忽略gcc特定的线程专有存储,并使用posix thead专用存储。它应该工作,它不是牛羚特有的。在 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); 
} 
+0

迄今为止,它在linux和solaris 64位环境中都很好用。编译就像一个魅力。还在等待测试完成,但它看起来非常有前途。在附注中,posix thead特定存储在性能方面与gnu相比如何。在我的测试中,我没有注意到任何有戏剧性的东西,但我对这方面很感兴趣。另一位评论者提到thread_specific_ptr有明显的性能损失。 – Charles 2010-11-08 16:23:32

+0

老实说,我从来没有用过GNU扩展。我很想知道它是如何工作的。 – 2010-11-08 16:42:18

1

你可以尝试添加-pthread命令行选项G ++:这个选项意味着,在海湾合作委员会的说法:“做POSIX线程支持所需的一切。”这可能解锁支持__thread

线程本地存储与__thread需要在编译器中,但在连接器(静态链接器,在编译结束时调用,动态链接器,当程序执行时)都需要一些特定的系统支持。我不知道你的特定组合(一个相当老的g ++与一个相当老的Solaris)是否被支持(一些谷歌搜索表明,有些人可以在较旧的gcc [3.4.3]和更新的Solaris [10]中使用它)。如果不支持,可以使用POSIX/Single Unix功能pthread_key_create(),pthread_setspecific()pthread_getspecific()。它们比__thread限定符稍微慢一点,并不像方便,但至少它们工作正常。

相关问题