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); } }
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! } }