Пример #1
0
            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();
                }
            }
Пример #2
0
            public void Depart()
            {
                int c = var--;

                if (c == 1)
                {
                    parent.Depart();
                }
            }
Пример #3
0
        public void Decrement()
        {
            ISnziNode node = nodes[GetRandomIndex()];

            node.Depart();
        }