2009-10-02 13 views
6

Jaki jest najprostszy sposób tworzenia aplikacji wielowątkowych za pomocą C/C++?Jaki jest najprostszy sposób tworzenia aplikacji wielowątkowych za pomocą C/C++?

+8

Najprostszym sposobem pisania programów współbieżnych jest niestosowanie wątków w sposób jawny. Co próbujesz zrobić? – Amok

+2

Następną wersją języka C++, z miłością określaną jako C++ 0x, są coraz nowsze obiekty: http://en.wikipedia.org/wiki/C%2B%2B0x#Threading_facilities – luke

+1

luke - to nadal nie będzie uczynić to prostym! –

Odpowiedz

14

Niestety nie ma łatwego sposobu. Kilka opcji: pthread na linuxie, wątki ap32 win32 na windows lub boost :: biblioteka wątków

5
+4

Jest to coś, co uważam za mało pomocne, szczególnie w porównaniu z rekomendacją boost. Posix nie jest łatwo przenośny do środowisk Win32, a API jest prymitywne, jak tylko możesz. – Jherico

+0

Oczywiście, nie będzie to łatwe do programowania wielowątkowego, ale przynajmniej jest dobrze udokumentowane. –

+0

pthreads są obsługiwane w systemie Windows: http://sourceware.org/pthreads-win32/ Wszystkie wątki API są prymitywne ... Jeśli chcesz wyższego poziomu niż możesz użyć wątku, lub aktorów, lub innej abstrakcji ponad wątkami. –

13

Jest nrłatwy sposób tworzenia wielowątkowych aplikacji w dowolny językowej.

+8

To nie jest prawda. Wybór odpowiedniego języka do zadania może ułatwić programowanie wielowątkowe. – Amok

+3

Pytam o najłatwiejszy sposób – SomeUser

+6

Programowanie wielowątkowe może ** wyglądać ** łatwo, biorąc pod uwagę prosty język, ale jest to jeden z najtrudniejszych problemów programistycznych, aby uzyskać właściwy. * Jeśli uważasz, że jesteś wystarczająco inteligentny, aby zaimplementować poprawną wielowątkowość, to nie jesteś w najwyższym stopniu * – voyager

1

Powiedziałbym z Qt. Qt Threads i Qt Concurrency są prawdopodobnie warte googlowania.

2

Specyfikacja C++0x obejmuje gwintowania obiektów (jeden z moich ulubionych nowych funkcji). Wkrótce nie będzie miało znaczenia, dla którego systemu operacyjnego się kompilujesz! Wystarczy spojrzeć, jak łatwo jest stworzyć nowy wątek i dołączyć z powrotem do wątku Autor:

#include <thread> 
#include <iostream> 

class SayHello 
{ 
public: 
    void operator()() const 
    { 
     std::cout<<"hello"<<std::endl; 
    } 
}; 

int main() 
{ 
    std::thread t((SayHello())); 
    t.join(); 
} 

Visual Studio 2010 jest wdrożenie części C++ 0x, ale wciąż czekamy na obiektach gwintów.

+0

Tak długo, jak jesteś gotów pogodzić się z C++. Możesz zrobić to teraz w Javie, jeśli chcesz zrobić taką sprawę. –

+0

Dude .. Pytanie określa C/C++. –

+1

@James, chyba że coś się ostatnio zmieniło Nie sądzę, że std :: thread nie będzie kompletną alternatywą dla istniejących implementacji takich jak wątki POSIX. W szczególności brakuje jej funkcji, takich jak priorytety wątków. Zobacz tę odpowiedź SO, aby uzyskać szczegółowe informacje: http://stackoverflow.com/questions/1273572/will-pthreads-become-obablede-once-stdthread-makes-into-cox/1274301#1274301 ... Bez względu na to, nie można odmówić std :: wątek będzie bardzo miłym dodatkiem do standardu. – Void

3

Minęło trochę czasu, odkąd pracował w C++ i nie widziałem Boost gwintowania wspierać, ale uważam, że to bardzo pomocne do hermetyzacji semaphore usług świadczonych przez system operacyjny, zazwyczaj albo POSIX lub Win32, w prostych zajęć, które zdobądź zamki i uwolnij je w destruktorach, czyniąc ich użycie dość prostym.

void operateOnSharedResource(SharableResource & foo) { 
    MutexLock lock(foo.getMutex()); 
    // do stuff to foo 
    // implicit call to MutexLock dtor performs release 
} 

Ostatecznie istnieje wiele prostych sztuczek, takich jak ten, aby ułatwić programowanie wątek i byłbym zaskoczony, gdyby doładowania nie ma czegoś takiego przez NOW (EDIT: To robi i to udokumentowane w Lock Types).

Bez względu na to, główny problem związany z pisaniem wielowątkowego kodu nie będzie rozwiązany przez żadną bibliotekę osób trzecich, a to jest zrozumienie, gdzie kod może być użytecznie zrównoleglony i gdzie udostępnione zasoby zostaną dotknięte i muszą być być rozliczane. Oto kilka reguł, z których korzystam podczas pisania wielowątkowego kodu.

  • próbować minimalizować liczbę udostępnionych zasobów
  • Spróbuj hermetyzacji zasobów udostępnionych w klasie opakowania, które sprawiają wszystko operacje atomowe.
  • Dokonaj wątków roboczych jak najprostsze

Właściwa hermetyzacji naprawdę robi cuda na pisanie bezpieczniejszego kodu wielowątkowych, bo mniej rzeczy widać, tym mniej rzeczy może mieć sytuacji wyścigu.

5

Nie ma prostej odpowiedzi na to.To bardzo zależy od tego, co masz nadzieję zyskać dzięki wielowątkowości, platformie/kompilatorowi i modelowi, z którego chcesz korzystać. Każdy wątły interfejs API ma swoje pułapki.

I dlatego, że nikt dotąd o tym nie wspominał, OpenMP to kolejna opcja, która jest obsługiwana w wielu współczesnych kompilatorach głównego nurtu i ma na celu uproszczenie stosowania współbieżności. http://openmp.org/wp/

8

Wystarczy wspomnieć, bo to nie zostało wymienione: kompilator ze wsparciem OpenMP (http://openmp.org/wp/)

+1

Całkowicie się zgadzam! – Jacob

+0

Jeśli możesz dopasować swój program do tego modelu, to zdecydowanie jest to najłatwiejszy sposób. W rzeczywistości jestem w trakcie pisania krótkiego programu testowego z wykorzystaniem OpenMP z tego właśnie powodu. –

2

nie jestem pewien o najprostszy, ale IMO w większości biblioteki gwintowania przyjazny dla użytkownika jest tą zawartą w projekcie Poco C++. Aby uzyskać podgląd, spójrz na plik nagłówkowy Thread.h.

1

Nici Posixa są całkiem dobre, mają też świetną dokumentację i samouczki.

Nie tak łatwe jak wątki java, ale wciąż całkiem niezłe.

1

Wszystko zależy od tego, co robisz. Jeśli możesz dopasować to, co robisz do OpenMP, to jest droga do zrobienia. W przeciwnym razie możesz spojrzeć na Intel's TBB. TBB oferuje kilka przepływów pracy, do których powinieneś być zdolny, ale biblioteka jest podwójnie licencjonowana i możesz nie być w stanie zaakceptować żadnej z tych licencji. Jeśli zarówno OpenMP, jak i TBB są wyłączone, powinieneś rozważyć możliwości puli wątków systemu operacyjnego.

W pewnym momencie może być konieczne ugryzienie kuli i użycie funkcji Boost.Thread. Jeśli tak, to powinieneś spojrzeć na what makes multithreading in C++ hard (dobrze, aby przeczytać, nawet jeśli nie używasz C++ 0x: "To nie same wątki, to komunikacja powoduje problemy.Mutable shared state wprowadza niejawną komunikację" 3).

1

Najprostszym sposobem jest unikanie/minimalizowanie zmiennego stanu dzielenia.

Gdy masz już zmienny stan współdzielony, musisz zająć się blokowaniem, w którym istnieje duża trudność w pisaniu programów wielowątkowych.

2

Poza wymienionymi wyżej, ACE to kolejna popularna i szeroko stosowana platforma C++, która zapewnia hermetyzację wątków na wielu platformach. Jego styl C++ nie jest tak nowoczesny jak na przykład Boost.Thread, ale jest dość dojrzały.

Powiązane problemy