2010-11-08 62 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限定符稍微慢一點,並不像方便,但至少它們工作正常。

相關問題