Gdy się dobrze nad tym zastanowić, można dostrzec potrzebę, aby to funkcja switch_to zmieniała stan zadania (to z którego następuje przełączenie) dopiero po tym gdy jego stan zostanie zapisany w pamięci. Rzeczywiście tak jest wykonując funkcję switch_to (specjalną instrukcę ljmp powodującą przełączenie), mamy gwarancję, że w opisie zadanie z którego następuje przełączenie zostanie wyłączony pewien bit (bit busy) (natomiast w opisie zadania do którego następuje przełączenie bit busy zostanie włączony).
Zamieniając funkcję select_runnable na select_runnable_not_busy można zagwaranotować, że zadanie nie zostanie uruchomione na innym procesorze do momentu gdy faktycznie zostanie zatrzymane (bit busy wyłączony).
void scheduler() { disable_interrupts(); spinlock_lock(&scheduler_lock); struct task *new = select_runnable_not_busy_task(run_queue); current->state = RUNNABLE; new->state = RUNNING; /* zarezerwuj, aby inny procesor, nie wybral tego zadania */ spinlock_unlock(&scheduler_lock); current = new; switch_to(new); restore_interrupts(); }
To rozwiązanie jest poprawne.