, , 'prev' node -deletion. , , :
Head ==> A ==> B ==> C ==> D ==> Tail
^ ^
| |
Thread 1 Thread 2
, Thread 1 node B. , Thread 2 node C . , , :
Thread 1 Thread 2
---------------------- ----------------------
Lock B Lock C
A->next = C or D; <=?? B->next = D; <== B could be dead already
B->next = NULL; C->next = NULL;
B->deleted = 1; C->deleted = 1;
Unlock B Unlock C
. Thread 2 Thread 1, . Thread 1 second line "A- > next = D", Thread 2 B- > D. , Thread 1 Thread 2, A- > next node C, node B , node D .
, node, , 'prev' . :
Thread 1 Thread 2
---------------------- ----------------------
Lock B Lock C
Lock A waiting for B
A->next = C; waiting for B
Unlock A waiting for B
B->next = NULL; waiting for B
B->deleted = 1; waiting for B
Unlock B Lock B <= locking dead node
B->next = D; <= assigning to dead node
Unlock B
C->next = NULL;
C->deleted = 1;
Unlock C
, - . A- > node C, node B , D . , , , .
, , 'prev' node .
Thread 1 Thread 2
---------------------- ----------------------
Lock A Lock B
waiting for B Lock C
waiting for B B->next = D;
Lock B Unlock B
A->next = D; C->next = NULL;
Unlock A C->deleted = 1;
B->next = NULL; Unlock C
B->deleted = 1;
Unlock B
A- > D, B C .