To polecenie rrdthreads, które można uruchomić w darmowym dostawcy hostingu OnWorks, korzystając z jednej z wielu naszych darmowych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online systemu Windows lub emulator online systemu MAC OS
PROGRAM:
IMIĘ
rrdthreads — Postanowienia dotyczące łączenia biblioteki RRD w celu wykorzystania jej w programach wielowątkowych
STRESZCZENIE
Używanie biblioteki librrd w programach wielowątkowych wymaga pewnych dodatkowych środków ostrożności, ponieważ RRD
biblioteka w swojej oryginalnej formie nie była wcale bezpieczna dla wątków. Ten dokument opisuje
wymagania i pułapki na drodze do wykorzystania wielowątkowej wersji biblioteki librrd w Twoim
własne programy. Daje również wskazówki dla przyszłego rozwoju RRD, aby zachować wątek biblioteki-
bezpieczny.
Obecnie tylko niektóre operacje RRD są implementowane w sposób bezpieczny dla wątków. Wszystkie kończą się na
zwykły sufiks ""_r"".
OPIS
Aby używać biblioteki librrd w programach wielowątkowych należy:
· Połącz z biblioteka_th zamiast biblioteka (podczas linkowania użyj „-lrrd_th”)
· Używaj funkcji „_r” zamiast normalnych funkcji API
· Nie używaj żadnych specyfikacji czasu w stylu at. Analiza składniowa takich specyfikacji czasu jest
strasznie nie jest bezpieczne dla wątków.
· Nigdy nie używaj funkcji innych niż *"_r", chyba że wyraźnie udokumentowano, że funkcja ta jest
bezpieczny dla stóp.
· Każdy wątek POWINIEN wywołać „rrd_get_context()” przed pierwszym wywołaniem dowolnego wątku „librrd_th”
funkcja w celu skonfigurowania danych specyficznych dla wątku. Nie jest to ściśle wymagane, ale
jest to jedyny sposób sprawdzenia, czy przydział pamięci może zostać wykonany za pomocą tej funkcji.
W przeciwnym wypadku program może zakończyć działanie z błędem SIGSEGV w przypadku braku pamięci.
· Zawsze wywołuj „rrd_error_clear()” przed każdym wywołaniem biblioteki. W przeciwnym razie wywołanie
może się nie powieść z powodu wcześniejszego błędu.
UWAGI DLA DRR WKŁADOWCY
Od tej pory przy opracowywaniu RRD należy zachować pewne środki ostrożności:
· Używaj tylko funkcji bezpiecznych dla wątków w kodzie biblioteki. Wiele często używanych funkcji libc nie jest
thread-safe. Należy zachować ostrożność w następujących sytuacjach lub podczas korzystania z następującej biblioteki
Funkcje:
· Należy unikać bezpośrednich wywołań „strerror()”: zamiast tego należy używać „rrd_strerror()”.
wyświetla komunikat o błędzie dla każdego wątku.
· Rodziny funkcji „getpw*”, „getgr*”, „gethost*” (oraz kilka innych funkcji „get*”)
funkcje) nie są bezpieczne dla wątków: użyj wariantów *"_r"
· Funkcje czasu: „asctime”, „ctime”, „gmtime”, „localtime”: użyj wariantów *„_r”
· „strtok”: użyj „strtok_r”
· „tmpnam”: użyj „tmpnam_r”
· Wiele innych (zobacz dokumentację)
· Plik nagłówkowy o nazwie rrd_is_thread_safe.h jest dostarczany w wersji współpracującej z GNU
Preprocesor języka C do „zatruwania” niektórych z najpopularniejszych funkcji niebędących bezpiecznymi dla wątków za pomocą
Dyrektywa „#pragma GCC poison”. Wystarczy dołączyć ten nagłówek do plików źródłowych, które chcesz
zachowaj bezpieczeństwo wątków.
· Nie wprowadzaj zmiennych globalnych!
Jeśli naprawdę musisz użyć zmiennej globalnej, możesz dodać nowe pole do
Struktura „rrd_context” i modyfikacja rrd_error.c, rrd_thread_safe.c oraz
rrd_non_thread_safe.c
· Nie używaj „getopt” ani „getopt_long” w *„_r” (ani bezpośrednio, ani pośrednio).
„getopt” używa zmiennych globalnych i zachowuje się nieprawidłowo w aplikacji wielowątkowej, gdy
wywoływane jednocześnie. Zamiast tego zapewnij funkcję *_r przyjmującą wszystkie opcje jako funkcję
parametry. Możesz podać argumenty argc i **argv dla argumentów o zmiennej długości
listy. Zobacz „rrd_update_r” jako przykład.
· Nie używaj funkcji „rrd_parsetime”!
Używa wielu zmiennych globalnych. Możesz go używać w funkcjach, które nie są do tego przeznaczone.
bezpieczne dla wątków, jak w funkcjach, które opakowują wersję „_r” pewnej operacji (np.
„rrd_create”, ale nie w „rrd_create_r”)
OBECNIE WDROŻONE WĄTEK BEZPIECZNE FUNKCJE
Obecnie istnieją bezpieczne dla wątków warianty „rrd_update”, „rrd_create”, „rrd_dump”,
„rrd_info”, „rrd_last” i „rrd_fetch”.
Użyj rrdthreads online za pomocą usług onworks.net