Standard poz. Ta technika programowania polega na użyciu biblioteki „PTHREAD” do otwarcia jednego lub więcej wątków podprocesowych, które działają równolegle z głównym procesem.
Wdrożenie wątków przynosi ogromne korzyści do ostatecznego programu, ponieważ przyspiesza czas wykonywania, przeprowadzając wiele zadań jednocześnie, może być lepiej ustrukturyzowane i lepiej wykorzystuje zasoby systemowe.
Wątek jest tworzony z funkcją pthread_ create (). Po wywołaniu tej funkcji wątek zaczyna działać równolegle z głównym procesem. Po wywołaniu tej funkcji zwraca identyfikator wątku w wątku argumentu wyjściowego. Ten identyfikator służy w odniesieniu do utworzonego wątku, gdy używasz funkcji zarządzania wątkiem, takimi jak pthread_join () lub pthread_cancel ().
W tym artykule z podpowiedzi Linux dowiesz się, jak korzystać z funkcji pthread_cancel (), jednej z funkcji zarządzania wątkiem C, która pozwala anulować wątek, który już działa.
Składnia funkcji pthread_cancel () w języku C
int pthread_cancel (wątek pthread_t);Opis funkcji pthread_cancel () w języku c
Funkcja pthread_cancel () wysyła żądanie do systemu w celu anulowania wątku określonego przez identyfikator w wątku argumentu wejściowego.
Wezwanie funkcji pthread_cancel () nie oznacza natychmiastowego zakończenia wątku, ale żądanie tego. To, czy wątek jest zakończony po wywołaniu tej funkcji, zależy od przypisanych do niej atrybutów. Jeśli wątek jest tworzony z domyślnymi atrybutami, można go anulować.
Abrylne atrybuty wątku można odzyskać za pomocą funkcji pthread_setCancelState () i można je ustawić za pomocą pthread_setCancelType ().
Jeśli funkcja pthread_cancel () odniesie sukces, zwraca 0 w wyniku. Jeśli się nie powiedzie, zwraca niezerową wartość.
Funkcja pthread_cancel () z biblioteki PTHREAD jest zdefiniowana w „wątku.H ”nagłówek. Aby użyć tego i innych funkcji zarządzania wątkami, musisz dołączyć ten nagłówek w swoim programie w następujący sposób:
#włączaćProgramy korzystające z funkcji zarządzania wątkiem muszą zostać skompilowane, wywołując bibliotekę wątków z wiersza poleceń Linux. W przeciwnym razie wystąpią błędy.
Poniżej znajduje się specjalna sekcja, która wyjaśnia, jak prawidłowo skompilować programy wykorzystujące funkcje z biblioteki wątków.
Jak anulować działający wątek za pomocą funkcji pthread_cancel () w języku C
W tym przykładzie tworzymy wątek z funkcją pthread_create (), a następnie anulujemy go w środku wykonania za pomocą funkcji pthread_cancel ().
Aby to zrobić, tworzymy wątek „Thread_1”, który wykonuje funkcję th_function (), która składa się z pętli dla 10 cykli, z których każdy drukuje „Seconds z wątku init i liczba sekund upłynęła” zdanie w konsoli dowodzenia. Następnie wkłada się opóźnienie 1 sekundy, aby powtórzyć cykl ponownie. Tak więc czas wykonywania wątku wynosi około 10 sekund.
Po utworzeniu i uruchomieniu Thread_1 wprowadzamy 5-sekundowe opóźnienie za pomocą funkcji Main () i zakończymy podproces po połowie czasu wykonania. Aby zakończyć wątek, wywołujemy funkcję pThread_Cancel () i przekazujemy identyfikator Thread_1, który jest zwracany przez funkcję pthread_create () jako argument wejściowy po utworzeniu wątku. Teraz spójrzmy na kod tego przykładu:
#włączaćPoniższy obraz pokazuje kompilację i wykonanie kodu. Jak widać, wątek jest zakończony funkcją pthread_cancel () na środku wykonania lub 5 sekund po starcie:
W takim przypadku wątek akceptuje anulowanie, ponieważ jego atrybuty są ustawione na domyślnie przy tworzeniu poprzez określenie wskaźnika zerowego w argumentach wejściowych „attr” funkcji pthread_create ().
Błędy w użyciu funkcji pthread_cancel (): czym oni są i jak je zidentyfikować
Sposób ustalenia, czy występuje błąd podczas wywoływania tej funkcji, jest użycie warunku „jeśli”, w którym warunek wejściowy jest niezerowym wynikiem powrotu. Poniżej znajduje się fragment kodu przy użyciu tej metody wykrywania błędów:
if (pthread_cancel (wątek) != 0)Jedynym błędem, który może wygenerować ta funkcja, jest ten, który jest zdefiniowany jako ISRCH w „Errno.H ”nagłówek. Ten błąd jest generowany, gdy nieistniejący wątek jest odwoływany do argumentu wejściowego funkcji pthread_cancel ().
Błędy kompilacji w programach z wątkami
Podczas kompilacji programów GCC, które używają wątków, kompilacja może się nie powieść, jeśli nie zostanie wykonana poprawnie z wiersza poleceń.
Najczęstszy komunikat o błędzie wydawany przez kompilator stwierdza, że jedna z funkcji wątków, które odnosimy się w kodzie.
Błędy te często powodują marnowanie cennego czasu, sprawdzając nagłówki, które włożyliśmy do kodu, ich integralności i katalogów powiązanych z kompilatorem, ponieważ wszystko wskazuje, że problem istnieje.
Chociaż funkcje, które powodują błąd, są zdefiniowane w „Pthread.H" nagłówek i są uwzględnione w kodzie, kompilator nie rozpoznaje tych funkcji, chyba że biblioteka pthread jest wywoływana z wiersza poleceń podczas kompilacji.
Na zielono można zobaczyć poprawny sposób wywołania biblioteki PTHREAD z konsoli poleceń podczas kompilacji programów z wątkami w następujący sposób:
~ $ gcc -pthread ścieżka/nazwa pliku.C -O out_nameJak widać na poniższym rysunku, błąd znika, gdy biblioteka pthread jest wywoływana podczas kompilacji:
Wniosek
W tym artykule z podpowiedzi Linuksa pokazaliśmy, jak używać funkcji pthread_cancel (), aby poprosić system o zakończenie działającego wątku.
Patrzyliśmy na teoretyczny opis tej funkcji i pokazaliśmy jej składnię, argumenty wejściowe i wyjściowe oraz rodzaj danych, które każdy z nich akceptuje. Następnie zaimplementowaliśmy to, czego nauczyliśmy się poprzez praktyczny przykład z fragmentami kodowymi i obrazami, w których widzieliśmy, jak działa funkcja pthread_cancel () w języku C.
Dodaliśmy również specjalną sekcję, w której pokazaliśmy, jak prawidłowo skompilować programy zawierające wątki i funkcje z biblioteki pthread.