Kiedyś wszystkie funkcje ponownego wprowadzania są wątkowane. Ale czytam Reentrancy page in Wiki, to księguje kod, który jest „doskonale wklęsłego, ale nie bezpieczny wątku. Ponieważ nie zapewniają dane globalny jest w stanie spójnym podczas wykonywania”Dlaczego ten kod jest ciągły, ale nie wątkowy
int t;
void swap(int *x, int *y)
{
int s;
s = t; // save global variable
t = *x;
*x = *y;
// hardware interrupt might invoke isr() here!
*y = t;
t = s; // restore global variable
}
void isr()
{
int x = 1, y = 2;
swap(&x, &y);
}
nie rozumiem swoje wyjaśnienie . Dlaczego ta funkcja nie jest bezpieczna dla wątków? Czy to dlatego, że zmienna globalna int t
zostanie zmieniona podczas wykonywania wątków?
Ten przykład jest bardziej niż wymyślny. Ale powtórne wprowadzenie i zabezpieczenie wątków to pojęcia ortogonalne. –
Posix ma inną definicję ponownego przynależności "W POSIX.1c," funkcja ponownego wstępu "jest zdefiniowana jako" funkcja, której efekt, wywołany przez dwa lub więcej wątków, jest zagwarantowany tak, jakby każdy z wątków wykonywał funkcję jeden po drugim w niezdefiniowanej kolejności, nawet jeśli faktyczne wykonanie jest przeplatane ", co (całkiem niezły) przykład na wikipedii nie byłby zgodny z – nos
Wydaje mi się, że ten przykład nie jest powtórny: przerwane' swap() ' nie wymieniaj wartości wskazywanych przez 'x' i' y' zgodnie z oczekiwaniami ('* y' może być ustawione na 2 niezależnie od początkowej wartości' * x'). – rom1v