Na przykład:
void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
Jest możliwe stworzenie takiej kolejki. Będziemy mogli spokojnie dodawać do niej, usuwać z niej, sprawdzać, czy kolejka jest pusta. Niemożliwe będzie jednak przeglądanie tej kolejki, bo nie wiemy częścią jakiej struktury jest kolejno napotkany element.
Na przykład:
void move_last_runqueue(struct task_struct * p)
{
list_del(&p->run_list);
list_add_tail(&p->run_list, &runqueue_head);
}
struct task_struct p; /*proces, który chcemy oszukać*/
struct task_struct nowy_ojciec;
REMOVE_LINKS(p);
p->p_pptr = nowy_ojciec;
SET_LINKS(p);
Jeżeli początek listy jest związany z jakimś procesem, to ten proces musi być cały czas obecny w systemie. Dysponujemy co prawda idle, ale sprawa się komplikuje, gdy mamy wiele procesorów i musimy wybierać idle. Tak jest szybciej.
Zgodnie z semantyką flagi wyłączności, żeby procesy były budzone rzeczywiście pojedynczo, każdy element kolejki musi mieć ustawioną tę flagę. Poza tym oczywiście wszystko zależy od funkcji budzącej - może ona w ogóle nie zwracać uwagi na flagę wyłączności.
Konieczne jest zabezpieczanie pojedynczych operacji - bo mogły by się poplątać wskaźniki. Istotne jest również usuwanie procesów - jeśli przerwanie usunie proces, gdy chcemy go przejrzeć, może być problem. Nic nam natomiast nie grozi w przypadku dodawania - nie zakłóci to przeglądania.