Jak zaimplementować wielowątkowość w C++

Jak Zaimplementowac Wielowatkowosc W C



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 , poniżej znajduje się ich składnia:





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 lambda
auto 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ść.