public void Arrive() { int c = var++; if (c == 0) { parent.Arrive(); } }
public void Arrive() { bool succ = false; int undoArr = 0; while (!succ) { int x = var; short c, v; Decode(x, out c, out v); if (c >= 1) { if (Interlocked.CompareExchange(ref var, Encode((short)(c + 1), v), x) == x) { break; } } if (c == 0) { int temp = Encode(-1, (short)(v + 1)); if (Interlocked.CompareExchange(ref var, temp, x) == x) { succ = true; c = -1; v += 1; x = temp; } } if (c == -1) { parent.Arrive(); if (Interlocked.CompareExchange(ref var, Encode(1, v), x) != x) { undoArr += 1; } } } for (int i = 0; i < undoArr; i++) { parent.Depart(); } }
public void Increment() { ISnziNode node = nodes[GetRandomIndex()]; node.Arrive(); }