- , , . CAS , - , . , , , - , , , .
, :
elem->next = __sync_val_compare_and_swap(&head, head, elem);
. , , __sync_val_compare_and_swap(), head ( , , ),
- head , , head , next , . , , .
, - :
whatever_t* prev_head = NULL;
do {
elem->next = head;
prev_head = __sync_val_compare_and_swap(&head, elem->next, elem);
} while (prev_head != elem->next);
bool, :
do {
elem->next = head; // set up `elem->head` so the list will still be linked
// correctly the instant the element is inserted
} while (!__sync_bool_compare_and_swap(&head, elem->next, elem));
, , ( ). insert_element() ( , ).
ABA:
, ABA " ". , X , elem->next = head, head A1.
__sync_val_compare_and_swap() :
A1 , head B- -
A1 - ,
A2, , , , A1 A2 , head A2
A1 A2 /, ABA.
, X , head , - , , , X :