Czy ktoś może napisać prosty przykład uruchomienia dwóch wątków (obiektowych) w C ++.
Szukam rzeczywistych obiektów wątku C ++, w których można rozszerzyć metody uruchamiania (lub czegoś podobnego), zamiast wywoływać bibliotekę wątków w stylu C.
Pominąłem wszelkie specyficzne dla systemu operacyjnego żądania w nadziei, że ktokolwiek odpowie, skorzysta z bibliotek między platformami. Po prostu to teraz wyrażam.
c++
multithreading
Zak
źródło
źródło
Odpowiedzi:
Utwórz funkcję, która ma być wykonywana przez wątek, np .:
Teraz stwórz
thread
obiekt, który ostatecznie wywoła powyższą funkcję w następujący sposób:(Musisz
#include <thread>
uzyskać dostęp dostd::thread
zajęć)Argumenty konstruktora to funkcja, którą wykona wątek, a następnie parametry funkcji. Wątek jest automatycznie uruchamiany podczas budowy.
Jeśli później chcesz poczekać na zakończenie wątku w celu wykonania funkcji, wywołaj:
(Dołączenie oznacza, że wątek, który wywołał nowy wątek, będzie czekał na zakończenie nowego wątku, zanim będzie kontynuował wykonywanie).
Kod
Więcej informacji o std :: thread tutaj
-std=c++0x -pthread
.źródło
-std=c++0x
(zamiast-std=c++0x
) „Uważam, że drugim„ c ++ 0x ”powinno być„ c ++ 11 ”, ale nie można tego zmienić, ponieważ edycja jest zbyt mała.task1
. Wskaźnik funkcji jest również oznaczony przeztask1
. Ale dziękuję, że o tym wspomniałeś, ponieważ uważam, że się myliłem i jest to równoważne&task1
, więc nie ma znaczenia, którą formę wybierzesz do pisania (jeśli tak, to myślę, że wskaźnik do wskaźnika funkcji jest&&task1
- to byłoby złe ). Odpowiednie pytanie .No cóż, technicznie każdy taki obiekt zostanie skończony z biblioteką wątków w stylu C, ponieważ C ++ tylko określił
std::thread
model podstawowy w c ++ 0x, który został właśnie przybity i jeszcze nie został zaimplementowany. Problem jest dość systemowy, technicznie istniejący model pamięci c ++ nie jest wystarczająco ścisły, aby umożliwić dobrze zdefiniowaną semantykę dla wszystkich przypadków „zdarzało się przed”. Hans Boehm napisał jakiś artykuł na ten temat i przyczynił się do opracowania standardu c ++ 0x na ten temat.http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
To powiedziawszy, istnieje kilka wieloplatformowych bibliotek wątków C ++, które działają dobrze w praktyce. Bloki konstrukcyjne wątków Intel zawierają obiekt tbb :: thread, który jest zbliżony do standardu c ++ 0x, a funkcja Boost ma bibliotekę boost :: thread, która robi to samo.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
Używając boost :: thread otrzymujesz coś takiego:
źródło
Istnieje również biblioteka POSIX dla systemów operacyjnych POSIX. Sprawdź zgodność
skompiluj z -lpthread
http://en.wikipedia.org/wiki/POSIX_Threads
źródło
źródło
Podczas wyszukiwania przykładu klasy C ++, która wywołuje jedną z własnych metod instancji w nowym wątku, pojawia się to pytanie, ale nie byliśmy w stanie użyć żadnej z tych odpowiedzi w ten sposób. Oto przykład, który to robi:
Klasa. H
Class.cpp
Zauważ, że ten przykład nie dotyczy muteksu ani blokowania.
źródło
O ile nie chcemy osobnej funkcji w globalnych przestrzeniach nazw, możemy używać funkcji lambda do tworzenia wątków.
Jedną z głównych zalet tworzenia wątków przy użyciu lambda jest to, że nie musimy przekazywać parametrów lokalnych jako listy argumentów. Do tego samego możemy użyć listy przechwytywania, a właściwość zamknięcia lambda zajmie się cyklem życia.
Oto przykładowy kod
Do tej pory uważam, że lambda C ++ są najlepszym sposobem tworzenia wątków, szczególnie dla prostszych funkcji wątków
źródło
W dużej mierze zależy to od biblioteki, z której zdecydujesz się korzystać. Na przykład, jeśli używasz biblioteki wxWidgets, tworzenie wątku wyglądałoby tak:
Jeśli główny wątek wywołuje metodę CreateThread, utworzysz nowy wątek, który rozpocznie wykonywanie kodu w metodzie „Entry”. W większości przypadków będziesz musiał zachować odniesienie do wątku, aby go dołączyć lub zatrzymać. Więcej informacji tutaj: dokumentacja wxThread
źródło