2012-08-02 7 views
12

Próbuję tylko użyć funkcji g++ 4.6 i C++11. Za każdym razem, gdy kompiluję prosty kod wątku przy użyciu flagi -std=c++0x, albo ulega awarii z błędem segmentacji, albo po prostu wyrzuca jakiś dziwny wyjątek.W g ++ jest wątek C++ 11 za pomocą pthreads w tle?

Przeczytałem kilka pytań związanych z wątkami C++11 i zdałem sobie sprawę, że muszę również użyć flagi -pthread, aby poprawnie skompilować kod. Korzystanie z -pthread działało dobrze i mogłem uruchomić kod z gwintem.

Moje pytanie brzmi, czy wielowątkowy model C++11 używa Pthreads w tle? Czy jest napisane od zera?

Nie wiem, czy któryś z członków to gcc współpracowników, ale jestem po prostu ciekawy.

+0

@ Wygląda na to, że pytanie dotyczy g ++ 4.6. – juanchopanza

+2

"Niektóre dziwne wyjątki" to prawdopodobnie 'std :: system_error', wymagane przez standard, gdy wątków nie można utworzyć (np. Ponieważ nie masz połączenia z libpthread.so z' -pthread'). Pracuję nad poprawą komunikatu, który daje wyjątek, zobacz http://gc.gnu.org/PR52681 –

+1

@ JonathanWakely .... Tak, to jest wyjątek, z którym mam do czynienia na moim komputerze z Linuksem ... z AMD Turion X2 .... Podczas gdy wszystko poszło gładko bez flagi '-pthread' na mojej maszynie współlokatorów Intel ... – Recker

Odpowiedz

21

Jeśli uruchomisz g++ -v, otrzymasz kilka informacji o tym, jak został skonfigurowany. Jedna z tych rzeczy, na ogół będzie to linia, która wygląda

Thread model: posix 

co oznacza, że ​​został skonfigurowany do korzystania z pthreads swojej biblioteki gwintowania (std :: gwintu w libstdC++), a co oznacza, że ​​również trzeba użyć dowolnego flagi, które mogą być wymagane dla pthreads w twoim systemie (-pthread w systemie Linux).

To nie ma nic konkretnego do zrobienia ze standardem, to tylko szczegół jak średnia jest realizowany przez g ++

+4

NB jedna z tych rzeczy będzie zawsze tą linią, jeśli obsługa wątku jest nieobecna, powie "Model wątku: pojedynczy" –

+0

Należy zauważyć, że raportowany model gwintu GCC odzwierciedla również inne części GCC, takie jak libgcc i sam kompilator. Wiele rzeczy może być zbudowanych na podstawie tej implementacji wątków, nie wszystkie równie oczywiste. GCC jest dość "monolityczny" w tym względzie ... – rubenvb

9

C++ nie określa, w jaki wątki są wdrażane. W praktyce wątki C++ są na ogół implementowane jako cienkie obwoluty w istniejących wcześniej bibliotekach wątków systemowych (takich jak wątki pthreads lub windows). Istnieje nawet przepis umożliwiający dostęp do bazowego obiektu wątku z std :: thread :: native_handle().

+2

G ++ nie jest kompilatorem unixowym, działa również na Windowsie, gdzie można go skonfigurować do używania pthread-win32 lub natywnych wątków Windows. Do tej pory nikt nie wykonał pracy dla GCC, aby jego biblioteka wątków C++ 11 działała z wątkami Windows, zamieściłem kilka pomysłów na http://gcc.gnu.org/ml/libstdc++/2012-05/msg00020.html –

2

Powodem jego awarii jest to, że jeśli nie podasz -pthreads lub -lpthreads, kilka słabo zdefiniowanych funkcji pośredniczących Pthreads z libc jest połączonych. Te funkcje pośredniczące są wystarczające, aby twój program mógł łączyć się bez błędów. Jednak w rzeczywistości tworzenie pthread wymaga pełnej biblioteki libpthread.a, a gdy dynamiczny linker (dl) próbuje rozwiązać te brakujące funkcje, dostaniesz naruszenie segmentacji.

Powiązane problemy