Wielowątkowość w C++ to funkcja, która pozwala na jednoczesne wykonywanie wielu zadań. Wątek jest jednostką roboczą konkretnego wykonywanego procesu. Wiele wątków jest wykonywanych niezależnie od siebie w tym samym czasie, aby zapewnić wielowątkowość.
Jak zaimplementować wielowątkowość w C++
Program wielowątkowy składa się z dwóch lub więcej części, które zwykle działają jednocześnie. Każda część nazywana jest wątkiem i ma inną ścieżkę wykonania. Wiele wątków jest wykonywanych niezależnie od siebie w tym samym czasie, aby zapewnić wielowątkowość.
Wymagania wstępne dotyczące wielowątkowości w C++
Na Windowsie funkcje związane z wątkami można wykonywać w C++ 11 i wersjach zaawansowanych. Podczas korzystania z kompilatora Dev-C++ domyślnie znajduje się on w wersji C++ 3, dlatego należy go ręcznie zmienić na wersję C++ 11. Środowisko GNU C++11 można wybrać, zmieniając ustawienia standardu językowego.
Otwórz kompilator Dev-C++ i przejdź do „Narzędzia” na pasku zadań. Wybierz „Opcje kompilatora”, a następnie wybierz „Ustawienia”, kliknij blok „Generowanie kodu”, pojawi się lista poleceń. Wybierz GNU C++ 11 z „Language Standard(-std)”, a następnie kliknij OK. Teraz ten kompilator jest ustawiony do obsługi operacji na wątkach.
Pobierz biblioteki z GitHuba i umieść je w folderze lib kompilatora Cpp. Wywołaj te biblioteki w programie, używając plików nagłówkowych #include „mingw.thread.h” i
std::thread obiekt_wątku ( możliwy do wywołania ) ;
Std::thread jest obsługiwany przez plik nagłówkowy #include „mingw.thread.h” w C++ 11. Jest to klasa wątku i reprezentuje pojedynczy wątek. Za pomocą std::thread tworzony jest nowy wątek i przekazywany jest do niego element wywołujący. Callable to kod wykonywalny, który jest wykonywany podczas działania wątku. Wywoływalny może być dowolnym z trzech typów podanych poniżej:
Kiedy obiekt jest tworzony, uruchamia nowy wątek, który wykonuje kod w wywołaniu.
Uruchomienie wątku przy użyciu obiektu funkcyjnego
Obiekt funkcji może zostać użyty jako obiekt wywołujący do uruchomienia wątku, operator przeciążenia () sprawia, że jest on wywoływalny:
klasa klasa_obiektu_funkcji {operatora pustego ( ) ( parametry )
{
Sprawozdania;
}
}
std::thread obiekt_wątku ( klasa_obiektu_funkcji ( ) , param )
Funkcja przeciążenia jest dostarczana konstruktorowi jako pierwszy obiekt, a instrukcje jako drugi obiekt.
Uruchomienie wątku za pomocą wskaźnika funkcji
Zdefiniowano wskaźnik funkcji, który następnie jest używany jako obiekt wywołujący do uruchomienia wątku:
unieważnić wywołanie funkcji ( param ){
Sprawozdania;
}
std::thread wątek_obj ( wywołanie_funkcji, parametry ) ;
Argumenty do przekazania zapisuje się po nazwie funkcji.
Uruchomienie wątku przy użyciu wyrażenia Lambda
Obiekt wątku można uruchomić przy użyciu lambdy jako obiektu wywoływalnego.
// Zdefiniuj wyrażenie lambdaauto f = [ ] ( parametry )
{
Sprawozdania;
} ;
std::thread obiekt_wątku ( f, param ) ;
Zdefiniowano wyrażenie lambda i wywołano w nim parametry w celu uruchomienia wątku.
W niektórych przypadkach wątek musi się zatrzymać, zanim zacznie wykonywać następne polecenie. The std::wątek::dołącz () Funkcja służy do oczekiwania na zakończenie wątku. Przykładowo, jeśli przypiszemy zadanie GUI do wątku, musimy poczekać na jego zakończenie, aby najpierw poprawnie załadować GUI, a następnie nastąpi wykonanie kolejnego polecenia.
int główny ( ){
std::wątek t1 ( możliwy do wywołania ) ;
t1.dołącz ( ) ;
Sprawozdania;
}
Przykład
Jest to program wykonywany w celu wykonywania wielowątkowości przy użyciu wszystkich trzech wywoływalnych. Trzy różne wywoływalne wykonują swoje polecenia jednocześnie trzy razy, bez wzajemnego przerywania:
#include#uwzględnij
używając przestrzeni nazw std;
puste foo ( int Z )
{
Do ( int ja = 0 ; I < Z; ja++ ) {
cout << „Wątek używający funkcji”
'wskaźnik jako wywoływalny \N ' ;
}
}
klasa wątek_obiekt {
publiczny:
operatora pustego ( ) ( intx )
{
Do ( int ja = 0 ; I < X; ja++ )
cout << „Wątek używający funkcji”
' obiekt jako wywoływalny \N ' ;
}
} ;
// kod główny
int główny ( )
{
cout << „Wątki 1, 2 i 3”
„działać niezależnie”
<< koniec;
wątek th1 ( bla, 3 ) ;
wątek th2 ( wątek_obj ( ) , 3 ) ;
auto f = [ ] ( intx ) {
Do ( int ja = 0 ; I < X; ja++ )
cout << „Wątek używający lambdy”
' wyrażenie jako wywoływalne \N ' ;
} ;
wątek th3 ( F, 3 ) ;
th1.dołącz ( ) ;
th2.dołącz ( ) ;
th3.dołącz ( ) ;
powrót 0 ;
}
W tym programie trzy wywoływalne funkcje, w tym wskaźnik funkcji, obiekt funkcji i wyrażenie lambda, są używane do jednoczesnego uruchamiania trzech wątków. Wątki 1, 2 i 3 drukują swoje wartości jednocześnie, niezależnie od siebie i bez wzajemnego przerywania. Drukują swoje wartości trzykrotnie. Funkcja Join() służy do oczekiwania na zakończenie wątku.
Dane wyjściowe wszystkich trzech wątków są wyświetlane niezależnie i powtarzane trzy razy. Każdy wątek czeka, aż drugi zakończy się jako pierwszy.
Wniosek
Wielowątkowość w C++ to funkcja, która pozwala na jednoczesne wykonywanie wielu zadań. Program wielowątkowy ma dwie lub więcej sekcji, które mogą działać jednocześnie, każda część nazywana jest wątkiem i ma oddzielną ścieżkę do wykonania. Istnieją trzy wywołania umożliwiające uruchamianie wątków, wskaźników funkcji, obiektów funkcyjnych i wyrażeń lambda. Umożliwiają one wielowątkowość.