Здравствуйте, remark, Вы писали:
R>Нет. Объект-то может создаться по тому же адресу, но это не будет проблемой, т.к. он может там создаться только тогда, когда ни у одного потока не осталось указателей на старый объект (соотв. он не может быть аргументом для CAS), поэтому ABA быть не может.
Да, посидев и подумав, я уже начал это подозревать — просто не смог придумать сценарий когда-бы это стало проблемой
R>Это не то, с чем следует ознакамливаться, особенно без комментариев о неработоспособности.
Ну зато Вы прокомментировали — всё равно польза
Набравшись наглости, рискну обратиться с просьбой — Вы не могли бы раскритиковать ещё один пример
public class LockFreeStack<T> where T: class
{
class StackItem<T1> where T1 : class
{
public T1 Value;
public volatile StackItem<T1> Next = null;
public StackItem(T1 data) { Value = data; }
}
private volatile int count = 0;
private volatile StackItem<T> Head = null;
public int Count { get { return count; } }
public T Pop()
{
StackItem<T> tmpHead;
do
{
tmpHead = Head;
Thread.MemoryBarrier();
if (tmpHead == null) return null;
if (Interlocked.CompareExchange<StackItem<T>>(
ref Head, tmpHead.Next, tmpHead) == tmpHead)
{
Interlocked.Decrement(ref count);
return tmpHead.Value;
}
}
while (true);
}
public void Push(T data)
{
StackItem<T> item = new StackItem<T>(data);
StackItem<T> tmpHead;
do
{
tmpHead = Head;
item.Next = tmpHead;
Thread.MemoryBarrier();
if (Interlocked.CompareExchange<StackItem<T>>(
ref Head, item, tmpHead) == tmpHead)
{
Interlocked.Increment(ref count);
return;
}
}
while (true);
}
}