multithreading c with examples
Krótkie wprowadzenie do wielowątkowości w C ++.
W tym samouczku omówimy wielowątkowość w C ++.
Więc co to jest nić? Wątek jest jednostką roboczą określonego procesu. W wieloprogramowych systemach operacyjnych różne procesy są wykonywane jednocześnie.
W podobny sposób możemy chcieć wykonywać te same instancje procesu jednocześnie. W tym przypadku każda instancja procesu jest przypisana do jednostki wykonawczej zwanej wątkiem. W systemie wielowątkowym wiele wątków jest wykonywanych jednocześnie niezależnie od siebie.
=> Zapoznaj się z przewodnikiem C ++ dla początkujących tutaj.
Przed C ++ 11 mieliśmy obsługę wątków POSIX. Ale ta funkcja miała poważne problemy z przenośnością, ponieważ działała tylko w systemie operacyjnym Linux lub UNIX. Zatem począwszy od C ++ 11 mamy jedną klasę std :: thread który definiuje wszystkie funkcje dla wątków. Klasy i funkcje są zdefiniowane w pliku nagłówkowym.
Czego się nauczysz:
Praca
Używając std :: thread musimy po prostu utworzyć nowy obiekt wątku i przekazać go jako wywoływalny. Element wywoływalny to wykonywalny kod, który chcemy wykonać, gdy wątek jest uruchomiony. Więc kiedy chcemy mieć nowy wątek, po prostu tworzymy obiekt std :: thread i przekazujemy wywoływalny argument jako argument do jego konstruktora.
Po utworzeniu obiektu std :: thread jest uruchamiany nowy wątek i wykonywany jest kod dostarczony przez callable.
jaki jest mój klucz bezpieczeństwa sieci
Zobaczmy, jak możemy zdefiniować wywołanie, które ma być dostarczone do obiektu wątku.
Element wywoływany można zdefiniować na trzy sposoby.
# 1) Korzystanie z obiektu funkcji
Możemy użyć obiektu funkcji jako wywoływalnego w obiekcie wątku. Aby użyć obiektu funkcji, musimy mieć klasę iw tej klasie przeciążamy operator (). Ta przeciążona funkcja zawiera kod, który ma zostać wykonany podczas tworzenia wątku.
/ / Define the class for function object class functioObject_class { // Overload () operator void operator()(params) { // code to be executed } }; // Create thread object
std::thread thread_object(functioObject_class (), params)
Zwróć uwagę na sposób, w jaki definiowany jest obiekt wątku. Jako pierwszy parametr konstruktora obiektu wątku podajemy przeciążoną funkcję, a następnie podajemy jej argumenty (parametry) jako drugi argument.
# 2) Korzystanie ze wskaźnika funkcji
Wywołalny wskaźnik funkcji można zdefiniować w następujący sposób.
void funct_call(params) //code to be executed }
Po zdefiniowaniu tej funkcji możemy utworzyć obiekt wątku z funkcją wywoływalną, w następujący sposób.
std::thread thread_obj(funct_call, params);
Zwróć uwagę, że argumenty (parametry) przekazane do funkcji są podawane po nazwie funkcji w obiekcie wątku.
# 3) Używanie wyrażenia lambda
Możemy również mieć wywoływalne wyrażenie lambda i przekazać je do obiektu wątku w celu wykonania. Fragment kodu dla tego samego jest pokazany poniżej.
// Define a lambda expression auto f = ()(params) { // code for execution };
std::thread thread_object(f, params);
W powyższym kodzie zdefiniowaliśmy wyrażenie lambda f, a następnie przekazujemy je do konstruktora obiektu wątku jako pierwszy argument, a następnie jego parametry (parametry) jako drugi argument.
std::thread join method
W niektórych przypadkach możemy chcieć, aby aktualnie wykonywany wątek zakończył się przed rozpoczęciem innej akcji.
Klasycznym przykładem jest otwarcie aplikacji GUI. W momencie, gdy otwieramy aplikację, uruchamiany jest wątek do załadowania i zainicjowania GUI i nie możemy wykonać żadnej akcji, dopóki ładowanie i inicjalizacja nie zostaną wykonane poprawnie, aby zapewnić prawidłowe działanie GUI.
to klucz bezpieczeństwa sieci taki sam jak hasło wifi
Klasa std :: thread zapewnia metodę join (), która zapewnia, że bieżący wątek (wskazywany przez * this) kończy się jako pierwszy przed wykonaniem jakiejkolwiek innej akcji.
Weźmy następujący przykład,
int main() { std::thread t1(callable_code); ….. t1.join(); ….. }
W powyższym przykładzie główna funkcja będzie musiała poczekać, aż zakończy się wątek t1. Ogólnie rzecz biorąc, funkcja join wątku blokuje inne akcje / funkcje do momentu zakończenia wykonywania przez wywołanie wątku.
Przykład wątku
Przedstawiamy kompletny przykład kodowania do tworzenia i wykonywania wątku w programie pokazanym poniżej.
#include #include using namespace std; // function to be used in callable void func_dummy(int N) { for (int i = 0; i Wynik:
Wątek 1 :: callable => wskaźnik funkcji
Wątek 1 :: callable => wskaźnik funkcji
Wątek 3 :: callable => wyrażenie lambda
Wątek 3 :: callable => wyrażenie lambda
Wątek 2 :: callable => obiekt funkcji
Wątek 2 :: callable => obiekt funkcji
W powyższym przykładzie utworzyliśmy trzy wątki przy użyciu trzech różnych wywoływalnych, tj. Wskaźnika funkcji, obiektu i wyrażenia lambda. Tworzymy 2 wystąpienia każdego wątku i uruchamiamy je. Jak pokazano na wyjściu, trzy wątki działają jednocześnie niezależnie od siebie.
Zalecana literatura = >> Przewodnik po testowaniu wątków
Wniosek
W tym samouczku widzieliśmy koncepcje wielowątkowości w C ++ z jasnym przykładem. W naszych kolejnych samouczkach nauczymy się więcej tematów C ++, które pomogą nam pisać solidne i wydajne programy.
=> Przeczytaj serię szkoleń Easy C ++.
rekomendowane lektury
- Samouczek dotyczący głównych funkcji języka Python z praktycznymi przykładami
- Python DateTime Tutorial z przykładami
- Polecenie Cut w systemie Unix z przykładami
- Składnia poleceń Unix Cat, opcje z przykładami
- Wykorzystanie kursora w MongoDB z przykładami
- Polecenie Ls w systemie Unix z przykładami
- Metoda MongoDB Sort () z przykładami
- Polecenie Grep w systemie Unix z prostymi przykładami