Pthread_function in C Language

Pthread_function in C Language

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ć
#włączać
#włączać
#włączać
void * th_function (void * n);
void main ()

pThread_T Thread_1;
pthread_create (& Thread_1, Null, & Th_function, NULL);
sen (5);
pthread_cancel (Thread_1);
sen (5);

/************************************************* *****/
void * th_function (void * n)

for (int sec = 0; sec!= 10; sec ++)

printf („sekundy z wątku init %i \ n”, sec);
sen (1);

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)
printf („wystąpił błąd próbujący anulować określony wątek”);

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_name

Jak 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.