Решение ABA - проблемы

237
14 мая 2018, 13:30

Необходимо решить ABA - проблему, используя младшие биты в качестве счетчика.

template <typename Obj>
class Stack {
volatile Obj* top_ptr;
//
// Снимает верхний элемент и возвращает указатель на него.
//
Obj* Pop() {
    while (1) {
        Obj* ret_ptr = top_ptr;
        if (!ret_ptr) return NULL;
        Obj* next_ptr = ret_ptr->next;
        top_ptr = (int*)(((unsigned __int64)top_ptr + 0x0001000000000000));
        // Если верхний элемент - всё ещё ret, считаем, что никто не менял   стек.
        // (Это утверждение не всегда истинно из-за проблемы ABA)
        // Атомарно заменяем top на next.
        if (CompareAndSwap(top_ptr, ret_ptr, next_ptr)) {
            return ret_ptr;
        }
        else
        {
            top_ptr = ret_ptr;
        }
        // Иначе - стек изменён, пробуем заново.
    }
}
//
// Добавляет obj_ptr на вершину стека.
//
void Push(Obj* obj_ptr) {
    while (1) {
        Obj* next_ptr = top_ptr;
        obj_ptr->next = next_ptr;
        a = (int*)(((unsigned __int64)a + 0x0001000000000000));
        // Если верхний элемент - всё ещё next, считаем, что никто не менял стек.
        // (Это утверждение не всегда истинно, из-за проблемы ABA)
        // Атомарно заменяем top на obj.
        if (CompareAndSwap(top_ptr, next_ptr, obj_ptr)) {
            return;
        }
        // Иначе - стек изменён, пробуем заново.
    }
  }
};
int main()
{
    Stack<int> *S = new Stack<int>();
    int *a = new int [10];
    a[0] = 5;
    printf("a = %p\n", a);
    a = (int*)(((unsigned __int64)a + 0x0001000000000000));
    printf("a = %p\n", a);
    return 0;
}
READ ALSO
Рекурсивный поиск файлов по маске во всех директориях и папках С++

Рекурсивный поиск файлов по маске во всех директориях и папках С++

Короче, проблема в том, что не получается попадать в другие диски и папки(выше чем лежит исполняемый файл)И вообще сильное ощущение, что написана...

242
задача про stack

задача про stack

Дана шеренга из n психовКаждому психу дан идентификатор от 1 до n На каждом ходе каждый псих, имеющий идентификатор больше, чем у психа справа...

197
Обратная польская запись - C++

Обратная польская запись - C++

Как и куда записать строку, которая будет парситься?

273
Как правильно сделать такой эффект в пагинации?

Как правильно сделать такой эффект в пагинации?

Как сделать такую анимацию пагинации перемещения точек элементов между числами 01, 02 , 03 , 04 ?

356