2012-08-02 55 views
12

我只是試着用g++ 4.6C++11功能。 每次我使用-std=c++0x標誌編譯一個簡單的線程代碼時,它會崩潰並出現分段錯誤,或者它只會引發一些奇怪的異常。g ++是在後臺使用pthreads的C++ 11線程模型嗎?

我看了一些與C++11線程有關的問題,我意識到我也需要用-pthread標誌來正確編譯代碼。使用-pthread工作正常,我能夠運行線程代碼。

我的問題是,C++11多線程模型在後臺是否使用Pthreads? 或者是從頭開始寫的?

我不知道是否有任何成員是gcc貢獻者,但我只是好奇。

+0

@Kay看起來問題是關於g ++ 4.6。 – juanchopanza 2012-08-02 19:17:54

+2

「某些奇怪的異常」可能是'std :: system_error',當線程無法創建時(例如,因爲您沒有用'-pthread'鏈接到libpthread.so),標準需要這個異常。我正在努力改進異常提供的信息,請參閱http://gcc.gnu.org/PR52681 – 2012-08-02 23:32:30

+1

@JonathanWakely ....是的,這是我在Linux機器上處理的異常......與AMD Turion X2 ....雖然它在我的室友英特爾機器上沒有'-pthread'標誌的情況下順利進行...... – Recker 2012-08-02 23:56:33

回答

21

如果您運行g++ -v它會給你一些關於它如何配置的信息。其中的一個事情通常會是一條線,看起來像

Thread model: posix 

,這意味着它被配置爲使用線程庫(STD ::線程的libstdC++)並行線程,並且這意味着你還需要使用任何可能需要系統上的pthreads所需的標誌(Linux上的-pthread)。

這有什麼具體做的標準,它只是如何標準由g實施的細節++

+4

NB其中一個東西將會是該線,如果線程支持不存在,它會說「線程模型:單一」 – 2012-08-02 23:28:01

+0

請注意,GCC報告的線程模型也反映在GCC的其他部分,如libgcc和編譯器本身。許多事情可能建立在線程實現的基礎之上,並非都是同樣明顯的。 GCC在這方面相當「單一」...... – rubenvb 2014-07-17 11:26:33

9

C++沒有指定線程是如何實現的。在實踐中,C++線程通常作爲比原有系統線程庫(如pthread或windows線程)更細的包裝來實現。甚至有一條規定可以用std :: thread :: native_handle()來訪問底層線程對象。

+2

G ++不是一個unix編譯器,它也可以在Windows上運行,它可以配置爲使用pthread-win32或本地Windows線程。到目前爲止,沒有人爲GCC完成其C++ 11線程庫與Windows線程一起工作,我發佈了一些想法,以http://gcc.gnu.org/ml/libstdc++/2012-05/msg00020.html – 2012-08-02 23:30:10

2

它崩潰的原因是,如果您未指定-pthreads-lpthreads,則會連接來自libc的一些弱定義的pthreads存根函數。這些存根函數足以讓您的程序無錯地鏈接。但是,實際創建一個pthread需要libpthread.a庫上完整,並且當動態鏈接器(dl)嘗試解決這些缺失的函數時,會出現分段違例。