[Cst-1b] CST1-b Question: Java 98/4/3

William R Sowerbutts will@sowerbutts.com
Wed, 3 May 2000 13:00:43 +0100


It *will* block, but only until your number comes up ... if it comes up
immediately, then it won't block at all. in other words, it only blocks while
another thread is in the critical region - it does NOT block until data
becomes available. thus you loop tightly through the critical region until
data becomes available, eating all allocated runtime for an entire processor.

Martin's solution will block until data becomes available, and is thus The One
True Way(tm).


Will

On Wed, May 03, 2000 at 12:53:39PM +0100, Hugh Nimmo-Smith wrote:
>I meant I dsagree with the eating CPU time bit... Martin's solution is
>slick...
>
>Hugh
>
>> -----Original Message-----
>> From: cst-1b-admin@srcf.ucam.org [mailto:cst-1b-admin@srcf.ucam.org]On
>> Behalf Of Hugh Nimmo-Smith
>> Sent: 03 May 2000 12:51
>> To: William R Sowerbutts
>> Cc: M.Y.W.Y.B.; cst-1b@srcf.ucam.org
>> Subject: Re: [Cst-1b] CST1-b Question: Java 98/4/3
>>
>>
>> I disagree because Scheduler.queue(int number) should block
>>
>> eg.
>>
>> class Scheduler {
>>
>>   private int number = 0;
>>
>>   void queue(int n)
>>   {
>>     // if it isnt time for n then block
>>     while (number < n) wait();
>>   }
>>
>>   synchronized void next()
>>   {
>>     number++;
>>     notifyAll(); // notify other waiting threads
>>   }
>> }
>>
>> That was my interpretation of the question
>>
>> Hugh
>>
>> > -----Original Message-----
>> > From: William R Sowerbutts [mailto:will@sowerbutts.com]
>> > Sent: 03 May 2000 11:13
>> > To: Hugh Nimmo-Smith
>> > Cc: M.Y.W.Y.B.; cst-1b@srcf.ucam.org
>> > Subject: Re: [Cst-1b] CST1-b Question: Java 98/4/3
>> >
>> >
>> > I would argue that this IS very different. If one thread calls
>> > put() when the
>> > buffer already contains a value, then this thread will eat up any
>> > available
>> > CPU runtime until the buffer become empty. Likewise, calling
>> > get() on an empty
>> > buffer will eat CPU runtime quite happily until the buffer is full.
>> >
>> > Martin's solution was very much better.
>> >
>> >
>> >
>> > On Wed, May 03, 2000 at 09:29:21AM +0100, Hugh Nimmo-Smith wrote:
>> > >My solution was something like this... not very different but possibly
>> > >safer:
>> > >
>> > >class SyncBuffer {
>> > >
>> > >  int value; // value in buffer
>> > >
>> > >  boolean valid; // is there a value in teh buffer
>> > >
>> > >  TicketMachine m = new TicketMachine();
>> > >  Scheduler s = new Scheduler();
>> > >
>> > >  void put(int v)
>> > >  {
>> > >    boolean put = false; // have we put are value into buffer yet??
>> > >
>> > >    while (!put)
>> > >    {
>> > >      int number = m.turn();
>> > >      s.queue(number);
>> > >      // we now have lock on object
>> > >
>> > >      // if there isn't a value in buffer then put our value
>> into buffer
>> > >      if (!valid) {
>> > >
>> > >        // put value in to buffer
>> > >        value = v;
>> > >
>> > >        // remember we have put value
>> > >        put = true;
>> > >
>> > >        // mark buffer as holding a value
>> > >        valid = true;
>> > >      }
>> > >
>> > >      s.next(); // notify other waiting threads
>> > >    }
>> > >  }
>> > >
>> > >  int get()
>> > >  {
>> > >    int result;
>> > >    boolean got_result = false; // have we got a value from buffer yet?
>> > >
>> > >    while (!got_result)
>> > >    {
>> > >      int number = m.term();
>> > >      s.queue(number);
>> > >      // we now have lock on object
>> > >
>> > >      // if there is a value in the buffer then get it...
>> > >      if (valid) {
>> > >
>> > >        // get the result
>> > >        result = value;
>> > >
>> > >        // set the buffer to not contain a value
>> > >        valid = false;
>> > >
>> > >        // remeber that we have got a value
>> > >        got_result = true;
>> > >      }
>> > >    }
>> > >  }
>> > >}
>> > >> -----Original Message-----
>> > >> From: cst-1b-admin@srcf.ucam.org
>> [mailto:cst-1b-admin@srcf.ucam.org]On
>> > >> Behalf Of M.Y.W.Y.B.
>> > >> Sent: 02 May 2000 22:03
>> > >> To: cst-1b@srcf.ucam.org
>> > >> Subject: [Cst-1b] CST1-b Question: Java 98/4/3
>> > >>
>> > >>
>> > >> CST 98/4/3
>> > >> http://www.cl.cam.ac.uk/tripos/y1998p4q3.pdf
>> > >>
>> > >> Hi!
>> > >>
>> > >> Has anyone solved the last part of the question in 98/4/3?
>> > >> "Show how a synchronised buffer holding a single value could be
>> > >> implemented
>> > >> using this new scheme".
>> > >>
>> > >> I assume that you are not allowed to use "synchronized", "wait()",
>> > >> "notify()" etc but only TicketMachine and Scheduler methods. But how?
>> > >>
>> > >> Thanks
>> > >>
>> > >> Moritz
>> > >>
>> > >>
>> > >> _______________________________________________
>> > >> CST-1B mailing list
>> > >> CST-1B@srcf.ucam.org
>> > >> http://www.srcf.ucam.org/mailman/listinfo/cst-1b
>> > >>
>> > >
>> > >
>> > >
>> > >_______________________________________________
>> > >CST-1B mailing list
>> > >CST-1B@srcf.ucam.org
>> > >http://www.srcf.ucam.org/mailman/listinfo/cst-1b
>> >
>> >
>> >
>> _________________________________________________________________________
>> > William R Sowerbutts (BtG)
>> will@sowerbutts.com
>> > Coder / Guru / Nrrrd
>> http://sowerbutts.com
>> >        main(){char*s=">#=0> ^#X@#@^7=";int c=0,m;for(;c<15;c++)for
>> >          (m=-1;m<7;putchar(m++/6&c%3/2?10:s[c]-31&1<<m?42:32));}
>> >
>> >
>>
>>
>> _______________________________________________
>> CST-1B mailing list
>> CST-1B@srcf.ucam.org
>> http://www.srcf.ucam.org/mailman/listinfo/cst-1b
>>
>
>
>
>_______________________________________________
>CST-1B mailing list
>CST-1B@srcf.ucam.org
>http://www.srcf.ucam.org/mailman/listinfo/cst-1b


_________________________________________________________________________
William R Sowerbutts (BtG)                            will@sowerbutts.com
Coder / Guru / Nrrrd                                http://sowerbutts.com
       main(){char*s=">#=0> ^#X@#@^7=";int c=0,m;for(;c<15;c++)for
         (m=-1;m<7;putchar(m++/6&c%3/2?10:s[c]-31&1<<m?42:32));}