C Language
Wielowątkowość
Szukaj…
Wprowadzenie
W C11 istnieje standardowa biblioteka wątków <threads.h>
, ale nie ma znanego kompilatora, który jeszcze ją implementuje. Tak więc, aby używać wielowątkowości w C, musisz używać specyficznych dla platformy implementacji, takich jak biblioteka wątków POSIX (często nazywana pthreads), używając nagłówka pthread.h
.
Składnia
- thrd_t // Zdefiniowany przez implementację pełny typ obiektu identyfikujący wątek
- int thrd_create (thrd_t * thr, thrd_start_t func, void * arg); // Tworzy wątek
- int thrd_equal (thrd_t thr0, thrd_t thr1); // Sprawdź, czy argumenty odnoszą się do tego samego wątku
- thr_t thrd_current (void); // Zwraca identyfikator wątku, który go wywołuje
- int thrd_sleep (const struct timespec * czas trwania, struct timespec * pozostały); // Zawieś wykonywanie wątku wywołania przez co najmniej określony czas
- void thrd_yield (void); // Zezwól na uruchamianie innych wątków zamiast wątku, który je wywołuje
- _Noreturn void thrd_exit (int res); // Kończy wątek wątek, który go wywołuje
- int thrd_detatch (thrd_t thr; // Odłącza dany wątek od bieżącego środowiska
- int thrd_join (thrd_t thr, int * res); // Blokuje bieżący wątek, dopóki dany wątek się nie zakończy
Uwagi
Korzystanie z wątków może wprowadzić dodatkowe niezdefiniowane zachowanie, takie jak http://www.riptutorial.com/c/example/2622/data-race . W celu zapewnienia bez wyścigu dostępu do zmiennych, które są współużytkowane przez różne wątki, C11 zapewnia funkcjonalność mtx_lock()
lub (opcjonalnie) http://www.riptutorial.com/c/topic/4924/atomics typy danych i powiązane funkcje w stdatomic.h
.
C11 Wątki prosty przykład
#include <threads.h>
#include <stdio.h>
int run(void *arg)
{
printf("Hello world of C11 threads.");
return 0;
}
int main(int argc, const char *argv[])
{
thrd_t thread;
int result;
thrd_create(&thread, run, NULL);
thrd_join(&thread, &result);
printf("Thread return %d at the end\n", result);
}
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow