2010-04-01 12 views
24

Poszukuję łatwej w obsłudze wieloplatformowej biblioteki wątków napisanej w C++.Czy istnieje wieloplatformowa biblioteka wątków w C++?

Jaka jest Twoja opinia na temat boost::thread lub Pthreads? Czy Pthreads działa tylko w systemach zgodnych z POSIX?

Co z obsługą wątków w bibliotece Qt?

+4

Jeśli weźmiesz pod uwagę Boost.Threads lub Qt, powinieneś usunąć znacznik 'C'. – sbi

+3

Nie wspominając już o tym, że nie ma języka programowania o nazwie C/C++. Jak widać, termin ten prowadzi do zamieszania. –

Odpowiedz

33

Boost.Thread jest wersją roboczą nadchodzącej standardowej biblioteki wątków języka C++. Wiedząc o tym, wolę go używać, ponieważ zapewnia pewne mocne gwarancje (ponieważ staje się standardem).

Aktualizacja: Teraz, gdy mamy standardowe biblioteki gwintów, trochę więcej doprecyzowanie. Niektóre konstrukty doładowania, takie jak boost :: shared_mutex, nie zostały ustandaryzowane (ale mogą być później). Jednak standardowa biblioteka lepiej wykorzystuje semantyczny ruch. Dobrze wiedzieć przed wyborem biblioteki. Ponadto użycie biblioteki wątków w C++ 11 wymaga kompilatora, który ją zapewnia. Nie dotyczy to wszystkich dzisiejszych kompilatorów.

Aktualizacja: Teraz [Nov2012] większość standardowych kompilatorów udostępnia bibliotekę wątków C++ 11. VS2012, GCC4.8 i Clang3.1 obsługują wątki i prymitywy synchronizacji oraz operacje atomowe. Do kompletnej implementacji możesz również użyć wątku po prostu Anthony Williams. Jest 11 Biblioteka zgodny C++ obsługiwane w systemie Windows/Mac i Linux.

Linki do stanu C++ 11 cech z różnych kompilatorów:

+0

Wiem, że ta odpowiedź jest stara, ale chciałbym dodać, że gcc 4.6 nie skompiluje Boost.Thread w trybie C++ 11.Może to być problem w którymkolwiek z nich, ale najprawdopodobniej gcc, ponieważ wsparcie C++ 11 jest obecnie w fazie rozwoju. –

+0

Dodam, że nadal musisz mieć kompilator dostarczający standardową bibliotekę wątków, aby go użyć, lub w inny sposób polegać na podbiciu. – Klaim

0

SDL jest prosty, wieloplatformowy i obsługuje wątki.

+0

SDL jest raczej głównie biblioteką multimedialną, prawda? Wolę coś bardziej zgrabnego. – NumberFour

4

Pthreads działają tylko w systemach POSIX. QThread od Qt to droga. Jest dostępny na platformach: Linux, Mac OS X, Windows, Embedded Linux, Windows CE, Symbian, Maemo.

+2

Co masz na myśli mówiąc "Wszystkie platformy" – osgx

+3

Tak, mam ten chip tutaj w moim tosterze, czy jest do niego dostępny Qt? ':)' – sbi

+0

Oficjalnie obsługiwana, win/mac/unix + x/embedded unix/wince/symbian/meamo - Prawdopodobnie więcej niż boost. –

2

Qt ma całkiem dobrą obsługę wątków. Jeśli potrzebujesz tylko utworzyć wątek i uruchomić w nim jakiś kod, to potrzebujesz tylko QThread. Istnieje wiele innych klas wysokiego poziomu, które mogą ci pomóc w tworzeniu puli wątków, a nawet abstrakcyjne współbieżne wykonywanie (struktura QtConcurrent).

+1

Qt rzeczywiście ma dobrą bibliotekę wątków; działa bardzo dobrze w aplikacjach Qt, ponieważ możesz łączyć sygnały między wątkami. Jeśli używasz elementów Qt, pozostanę przy wątkach Qt. – Will

0

Pthread jest częścią Posix, ale nie każdy system POSIX będzie miał wątki. pthreads jest najbardziej przenośny.

Jakie platformy będą wspierać?

+0

Cóż, Pthreads nie ma problemów z działaniem na Linuksie i innych systemach uniksowych, jak sądzę. Ale co z Pthreads na Windowsie? – NumberFour

+0

Używam pthreads na WIndows (skompilowany w cygwin). Więc jest wsparcie. –

8

Jest biblioteka wątków z C++ 11. Jest on zbudowany na bibliotece wątków doładowania. Niestety, wydaje mi się, że istnieją nietrywialne różnice między Boost.Threads i co C++ 11 pochodzi z. Mimo to, jeśli masz zamiar przejść do C++ biblioteki standardowej gwintowania, wierzę Boost.Threads jest najbliżej można dostać się do teraz.

Przypuszczam, że pod maską, biblioteki te będą korzystać Pthreads na systemach POSIX i cokolwiek natywne wsparcie gwint jest dostępny gdzie indziej.

Nota prawna: Nie współpracowałem z żadnym z nich.

4

Zobacz także OpenMP, jest to zestaw (w pewnym stopniu standard) pragma s specyfikacji obsługiwanych przez most major compilers. Zaletą OpenMP jest to, że jest on prosty i że Twój kod może być łatwo skompilowany w wersjach jedno- i wielowątkowych.

Wystarczy prosty przykład:

std::vector<double> a, b; 
... 
double sum = 0.0; 
... 
#pragma omp parallel for reduction(+:sum) 
    for (i=0; i < n; i++) 
    sum = sum + (a[i] * b[i]); 

Jest to oczywiście możliwe do zrobienia również morecomplexthings.

+0

Czy OpenMP jest również obsługiwany w systemie Windows? – NumberFour

+0

Tak, OpenMP jest obsługiwany w systemie Windows, Visual Studio 2005 i nowszych wersjach i oczywiście kompilatorach Intel. –

+0

I nie powinien wprowadzać żadnej zależności. – baol

1

wxWidgets ma klasy wątków, a ponieważ wxWidgets jest niezależny od platformy, może to być po prostu najlepsza rzecz dla Ciebie.

2

Lista odpowiednich platform. Jeśli używasz tylko powiedz: Linux/Mac/Windows, wtedy boost :: thread będzie ci dobrze, dopóki C++ 0x (harhar) nie dostarczy std :: thread.

1

Boost.Threads jest zbudowany na PThreadach w systemach UNIX i Win32 Threads w systemie Windows.

Biblioteka doładowania jest prostą syntaktycznie i zajęciem się wszystkimi owłosionymi sprawami właściwego połączenia kodu C++ z bibliotekami C zajmuje się za kulisami. Jeśli nie czujesz się komfortowo w C++, PThreads może wydawać się prostszy dzięki prostemu API C.

Nici Qt to także dobra biblioteka, ale ponieważ używam kilku innych bibliotek doładowania, skompiluję i połączę z Boostem bez względu na wszystko. Nie zawsze mogę łączyć się z Qt. No cóż, po prostu nie chcę pamiętać, jak korzystać z dwóch różnych bibliotek.

2

Użyłem pthreads dla kodu, który działa na wielu platformach. Aby obejść brak Pthreadów w systemie Windows, użyłem następującej biblioteki open source z wielkim sukcesem: POSIX Threads for Windows

+0

pthreads-w32 to stara szkoła. mingw-w64 dostarcza ulepszoną wersję o nazwie winpthreads. – cap

3

Jestem zaskoczony, że nikt nie wspomniał o Intel TBB library (powiązanej z moją kolejną odpowiedzią). Ponadto, task-based implementation should be preferred na podstawie wątku.

+0

Tak, również przyszły asynchroniczny model w C++ 11 jest dość łatwy w obsłudze. Tylko dla Windows PPL jest bardzo podobny do TBB i jest dobrze obsługiwany przez MS – Sarang

Powiązane problemy