Operacja na zmiennej preempt_count nie jest atomowa. Region kodu między inc i dec z preempt_count wątku gwarantuje, że harmonogram nie zostanie wyłączony. Przełączanie kontekstu z bieżącego wątku w tym regionie kodu może się odbywać tylko w dalszych osadzonych wyjątkach lub przerwaniach. Po zakończeniu pierwszej operacji inc kolejne moduły obsługi zobaczą, że zmienna jest niezerowa, a zatem nie powoduje przełączenia kontekstu. Przed zakończeniem wątku można wyłączyć wątek, ale jest ok, ponieważ kod nie dotarł do strzeżonego regionu.
Kilka szczegółów: Definicja zmiennej atomowej powinna być podobna do "Atomic variables are the ones on whom the read modify write operation is done as one instruction with out any interruption". Operacja "Read-Modify-Write" na preempt_count może zostać przerwana przez inną procedurę obsługi wyjątku lub procedurę obsługi przerwań, ale tylko w sposób ściśle osadzony, czyli przez projekt jądra. Ponieważ te operacje osadzone są w parach, więc wartość preempt_count nie zostanie ostatecznie uszkodzona. Chociaż operacja R-M-W może zostać przerwana, a bieżący wątek może zostać wyłączony (tylko, jeśli żaden z wielu wbudowanych elementów nie został zakończony), ale jest to ok, ponieważ kod nie dotarł do strzeżonego regionu. Po ponownym przełączeniu wątku będzie kontynuował operację R-M-W i od tego punktu bieżący wątek nie zostanie wyłączony do momentu zakończenia wszystkich sparowanych dekad.
Dziękuję bardzo. czy możesz odpowiedzieć na moje następne pytania też. – mousey
dziękuję bardzo. – mousey
@ cf i mousey: jeśli inc/dec jest również wywoływane przez procedury obsługi błędów lub procedury obsługi przerw, czy byłoby to bezpieczne? Czy istnieją jakieś zasady mówiąc, że nie można tego zrobić? Pomysły? – minghua