malloc () jest non-reentrant ale thread-safe? [duplikat]
Możliwy duplikat:
Malloc thread-bezpieczne?
Nie jestem trochę zdezorientowany podczas czytania "Linux Programming Interface".
Z książki wynika, że malloc nie jest reentrantowy, ponieważ manipuluje globalną strukturą danych List połączonych, ale jest bezpieczny dla wątków za pomocą mutex.
Jestem trochę zdezorientowany: ponieważ jest bezpieczny dla wątków z użyciem mutex i dlatego może być wywoływany przez więcej niż jeden wątek w tym samym czasie, dlaczego czy funkcja reentrantowa nie jest funkcją reentrantową? (jeśli mówimy, że reentrant oznacza, że może być wywołany przez więcej niż jednego rozmówcę w tym samym czasie)
Kolejne pytanie brzmi: skoro malloc jest bezpieczny dla wątków, czy możemy umieścić go w obsłudze sygnału? Myślę, że odpowiedź brzmi tak, ale nie jestem pewien, ponieważ według tej książki, mówi, że tylko reentrant lub async-signal-safe funkcja może być umieszczony w obsłudze sygnału.
Czy ktoś może mi to wyjaśnić?2 answers
Źle. Reentrant oznacza , że możesz ją przerwać i zadzwonić jeszcze raz, zanim poprzednie wcielenie się skończy . Wyobraź sobie, że malloc wygląda tak:Jeśli mówimy, że reentrant oznacza, że może być wywoływany przez więcej niż jeden rozmówca w tym samym czasie
lock(mutex);
/* Stuff. */
unlock(mutex):
Co się stanie, jeśli zostanie przerwane w środku, przed odblokowaniem i ktoś inny zadzwoni malloc
?
- pierwszy kontekst nie może być kontynuowany, dopóki drugi nie zostanie wykonany
- The drugi kontekst blokuje mutex i nie może być kontynuowany, dopóki pierwszy nie odblokuje mutex
Znowu źle. Zobacz przykład powyżej. Wyobraź sobie, że główny program wykonujeKolejne pytanie jest takie, że skoro malloc jest bezpieczny dla wątków, to czy możemy go w nadajniku sygnału? Myślę, że odpowiedź brzmi TAK
malloc
i zanim funkcja faktycznie zakończy wywołanie programu obsługi malloc.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 12:34:24
Reentrancy i thread-safety to dwa różne pojęcia. Funkcja reentrant może być non-thread-safe, a funkcja thread-safe może być non-reentrant.
Funkcje biblioteczne w C nie są gwarantowane jako reentrant i tylko funkcje reentrant mogą być wywoływane z programów obsługi sygnałów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 12:52:03