*/ class Stack { volatile Obj* top_ptr; // // Zdejmuje obiekt ze szczytu i zwraca wskaźnik do niego. // Obj* Pop() { while(1) { Obj* ret_ptr = top_ptr; if (!ret_ptr) return 0; Obj* next_ptr = ret_ptr->next; // Jeśli szczyt ciągle wskazuje na ret, to przyjmij, że nikt nie zmienił stosu. // (To twierdzenie nie zawsze jest prawdziwe ze względu na problem ABA) // Dokonuje atomowej wymianu szczytu z następnym. if (CompareAndSwap(top_ptr, ret_ptr, next_ptr)) { return ret_ptr;
// Stos jest zmodyfikowany, spróbuj ponownie.
// // Umieszcza obiekt wskazywany przez obj_ptr na stosie. // void Push(Obj* obj_ptr) { while(1) { Obj* next_ptr = top_ptr; obj_ptr->next = next_ptr; // Jeśli szczyt ciągle wskazuje na next, to przyjmij, że nikt nie zmienił stosu. // (To twierdzenie nie zawsze jest prawdziwe ze względu na problem ABA) // Dokonuje atomowej zamiany szczytu z obiektem. if (CompareAndSwap(top_ptr, next_ptr, obj_ptr)) { return;
// Stos jest zmodyfikowany, spróbuj ponownie.
Ten kod zwykle zapobiega problemom przy wielodostępie, lecz cierpi na problemy ABA.