我有一段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
任何帮助都非常感谢,因为我在周末一直在努力解决这个问题并面临最后期限。
谢谢, 查尔斯
答案 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上使用它作为参考来解决如何做到这一点。