2012-08-02 13 views
12

Sto provando solo le mie funzioni sulle funzioni g++ 4.6 e C++11. Ogni volta che compilo un semplice codice di threading usando il flag -std=c++0x, o si blocca con un errore di segmentazione o genera qualche strana eccezione.In g ++ è il modello di thread C++ 11 che utilizza pthreads in background?

Ho letto alcune domande relative ai thread C++11 e ho capito che, devo anche usare il flag -pthread per compilare correttamente il codice. L'utilizzo di -pthread ha funzionato correttamente e sono riuscito a eseguire il codice threaded.

La mia domanda è, se il modello multi-threading C++11 utilizza Pthreads in background? Oppure è stato scritto da zero?

Non so se qualcuno dei membri sia gcc contributori, ma sono solo curioso.

+0

@Kay sembra che la domanda riguardi g ++ 4.6. – juanchopanza

+2

La "qualche strana eccezione" è probabilmente 'std :: system_error', richiesto dallo standard quando i thread non possono essere creati (ad esempio perché non hai collegato a libpthread.so con' -pthread'). Sto lavorando per migliorare il messaggio che l'eccezione dà, vedi http://gcc.gnu.org/PR52681 –

+1

@JonathanWakely .... Sì, questa è l'eccezione che ho a che fare con la mia macchina Linux ... con AMD Turion X2 .... Mentre è andato liscio senza bandiera '-pthread' sui miei compagni di stanza macchina Intel ... – Recker

risposta

21

Se si esegue g++ -v, verrà fornita una serie di informazioni su come è stata configurata. Una di quelle cose sarà generalmente una linea che assomiglia

Thread model: posix 

il che significa che è stato configurato per utilizzare pthreads per la sua biblioteca di threading (std :: thread nel libstdC++), e che significa che è anche necessario utilizzare alcun contrassegni che potrebbero essere necessari per i pthread sul sistema (-pthread su Linux).

Questo non ha nulla di specifico a che fare con lo standard, il suo solo un dettaglio di come lo standard è attuato da g ++

+4

NB una di queste cose sarà sempre quella linea, se il supporto del thread è assente dirà "Thread model: single" –

+0

Si noti che il modello del thread GCC riportato si riflette anche su altre parti di GCC, come libgcc, e il compilatore stesso. Molte cose possono essere costruite in cima all'attuazione di questi thread, non tutti ugualmente ovvi. GCC è piuttosto "monolitico" a tale proposito ... – rubenvb

9

C++ non specifica come le discussioni sono implementate. In pratica i thread C++ vengono generalmente implementati come wrapper sottili su librerie di thread di sistema preesistenti (come pthreads o thread di Windows). C'è anche una disposizione per accedere all'oggetto thread sottostante con std :: thread :: native_handle().

+2

G ++ non è un compilatore Unix, funziona anche su Windows, dove può essere configurato per usare sia pthread-win32 o thread nativi di Windows. Finora nessuno ha fatto il lavoro per GCC per far funzionare la sua libreria di thread C++ 11 con i thread di Windows, ho postato alcune idee su http://gcc.gnu.org/ml/libstdc++/2012-05/msg00020.html –

2

Il motivo per cui si arresta in modo anomalo è che se non si specifica -pthreads o -lpthreads, un numero di funzioni stub indefinitamente definite da libc sono collegate. Queste funzioni di stub sono sufficienti per consentire al programma di collegarsi senza errori. Tuttavia, in realtà la creazione di un pthread richiede l'intera libreria libpthread.a e quando il linker dinamico (dl) tenta di risolvere quelle funzioni mancanti, si ottiene una violazione della segmentazione.

Problemi correlati