Необходимо решить 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;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости