예제 #1
0
        public void TestThread0()
        {
            var rnd = new System.Random();
            //put at most 1000 changes:
            int count = rnd.Next(1000);

            for (int i = 0; i < count; i++)
            {
                //This will work:
                Interlocked.Increment(ref good);
            }
            var inc_up = new Inc();

            for (int i = 0; i < count; i++)
            {
                m_state.Update(inc_up);
            }
            //Now decrement:
            count = rnd.Next(1000);
            for (int i = 0; i < count; i++)
            {
                //This will work:
                Interlocked.Decrement(ref good);
            }
            var dec_up = new Dec();

            for (int i = 0; i < count; i++)
            {
                m_state.Update(dec_up);
            }
        }
예제 #2
0
        public void Add(C customer)
        {
            var res   = _state.Update(new AddCust <C>(customer));
            var old_s = res.First;
            var new_s = res.Second;

            if (old_s.CustomersInServiceCount < new_s.CustomersInServiceCount)
            {
                //We have to do work now:
                C to_serve = customer;
                Pair <SQState <C>, SQState <C> > sres = null;
                ImmutableList <C> waiting;
                do
                {
                    Serve(to_serve);
                    sres = _state.Update(FINISH_UPDATE);
                    //Get out the customer waiting BEFORE we finished:
                    waiting  = sres.First.CustomersWaiting;
                    to_serve = waiting.Head;
                } while(!waiting.IsEmpty);
            }
            else
            {
                //Someone else is going to do the work!
            }
        }