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ć?
Author: Community, 2012-01-15

2 answers

Jeśli mówimy, że reentrant oznacza, że może być wywoływany przez więcej niż jeden rozmówca w tym samym czasie

Ź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:
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
To impas.

Kolejne 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

Znowu źle. Zobacz przykład powyżej. Wyobraź sobie, że główny program wykonuje malloc i zanim funkcja faktycznie zakończy wywołanie programu obsługi malloc.
 24
Author: cnicutar,
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.

 2
Author: ouah,
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