Wątki w C

Często w kodzie zachodzi potrzeba jednoczesnej obsługi kilku urządzeń i w takich przypadkach przychodzą nam z pomocą wątki. Wątki to biblioteki, które potrafią wywołać określone funkcje równolegle.

Ja pokaże wam przykład wątków w bibliotece Linuxowej POSIX (będzie to potrzebne do tworzenia urządzeń na Linuxie Raspberry PI). Jeśli będziecie chcieli użyć tych wątków w Windowsie, to będziecie musieli zainstalować CygWin'a.

Czas życia wątku składa się z 3 faz.

Zadeklarowanie wątku (przypisanie wątkowi jakiejś zmiennej np. t0):

pthread_t t0;

Wykonanie wątku (wywołanie wątku t0 jako funkcja wykonaj1):

pthread_create(&t0,NULL,wykonaj1,NULL)

Zakończenie wątku (czekanie, aż wątek zakończy działanie, aby uniknąć błędów pamięci):

pthread_join(t0,&result)

Dla przykładu zaprezentuje kod, w którym wywołujemy dwa wątki t0 i t1 równolegle. Do tych wątków przypisane są dwie funkcje wykonaj1() i wykonaj2(), które mają za zadanie napisać coś na standardowy strumień wyjścia. W normalnym działaniu takich funkcji, najpierw zostałaby wykonana funkcja wykonaj1(), a następnie funkcja wykonaj2(). A dzięki wątkom program wykonuje równolegle dwie funkcje jednocześnie.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
 
void* wykonaj1(void *a)
{
 int i=0;
 for(i=0;i<5;i++)
 {
 sleep(1);
 puts("wykonuje watek 1");
 }
 return NULL;
}
void* wykonaj2(void *a)
{
 int i=0;
 for(i=0;i<5;i++)
 {
 sleep(1);
 puts("wykonuje watek 2");
 }
 return NULL;
}
void error(char *msg)
{
 fprintf(stderr,"%s:%s\n",msg,strerror(errno));
 exit(1);
}
 
int main(){
 
 pthread_t t0;
 pthread_t t1;
 
 if(pthread_create(&t0,NULL,wykonaj1,NULL)==-1)
 error("Nie mozna utworzyc watku t0");
 if(pthread_create(&t1,NULL,wykonaj2,NULL)==-1)
 error("Nie mozna utworzyc watku t1");
 
 void* result;
 if(pthread_join(t0,&result)==-1)
 error("Blad oczekiwania na zakonczenie watku t0");
 if(pthread_join(t1,&result)==-1)
 error("Blad oczekiwania na zakonczenie watku t0");
}

Aby skompilować program należy użyć polecenia:

sudo gcc watki.c -lpthread -o watek

Gdzie watki.c to nasz program, a watek, to program skompilowany. W wyniku tych działań powinniśmy dostać taki rezultat: