RE: Additional Monitors test cases

"Thong (Tum) Nguyen" <tum-x2aT3/[email protected]>
Newsgroups gmane.comp.gnu.dotgnu.developer
Message-ID <[email protected]>
Just wanted to add that this _is_ how pnet monitors is written (bugs not
withstanding) :-).

^Tum

> -----Original Message-----
> From: Thong (Tum) Nguyen [mailto:tum-x2aT3/[email protected]]
> Sent: Wednesday, 5 May 2004 6:04 p.m.
> To: 'Russell Stuart'
> Cc: [email protected]
> Subject: RE: [DotGNU]Additional Monitors test cases
> 
> I agree.  I was wrong in that statement.  The thread in threadFunc doesn't
> wake up until the first thread releases its lock (or in this case, when it
> calls Abort).  The weird thing is that after the abort, both threads are
> in
> a lock block though only one owns the lock.
> 
> > -----Original Message-----
> > From: Russell Stuart [mailto:[email protected]]
> > Sent: Wednesday, 5 May 2004 5:35 p.m.
> > To: Thong (Tum) Nguyen
> > Cc: [email protected]
> > Subject: RE: [DotGNU]Additional Monitors test cases
> >
> > On Wed, 2004-05-05 at 14:26, Thong (Tum) Nguyen wrote:
> > > I haven't had a chance to run your tests but the last two look highly
> > time
> > > dependent.  For example:
> > >
> > >                public String testMonitorAbortAfterWait()
> > >                {
> > >                        ...
> > >                        lock (this.o)
> > >                        {
> > >                                Monitor.Pulse(o);
> > >                                Thread.Sleep(2*1000);
> > >                                thread.Abort();
> > >                                this.seen = true;
> > >                        }
> > > 				...
> > >                }
> > >
> > >                void threadFunc()
> > >                {
> > >                        Monitor.Enter(this.o);
> > >                        lock (this)
> > >                        {
> > >                                Monitor.Pulse(this);
> > >                        }
> > >                         try
> > >                         {
> > >                                 Monitor.Wait(this.o);
> > >                                 this.result = "Expected
> > > System.Threading.ThreadAbortExcep
> > >                                 return;
> > >                         }
> > >                         catch (ThreadAbortException)
> > >                         {
> > >                          ...
> > > 				}
> > >
> > > The first thread pulses "o" which causes the thread inside threadFunc
> to
> > > wakeup.  Once it wakes up, it immediately returns with "Expected
> > > ThreadAbortException".  The first thread doesn't even get a chance to
> > abort
> > > the thread.
> >
> > Ahh, I see where the problem lies.  This is not documented at all well
> > by Microsoft.  Fortunately, the C# Monitors are meant to be a fairly
> > exact emulation of the java monitors, and thus you can rely on the Java
> > doco for this case.   That is why I sent you a java URL - so you could
> > read and understand what I was on about.  Here is the URL again:
> > http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#wait(long)
> >
> > You may not be convinced that C# monitors are meant to be an exact
> > emulation of the Java ones.  I offer three arguments re why I think they
> > are:
> >
> > 1.  It would be very yucky if they behaved in any other manner.  When
> >     programmer writes:
> >       lock (obj) { ... @1 ...; wait(obj); ... @2 ... }
> >     He justifiably expects the code at both @1 and @2 to be guarded
> >     by the lock.  If that were no so, every Java / C# book in existence
> >     would say the above is bad style.  They would instead say that since
> >     there are no firm guarantees that the lock is in place when @2 is
> >     executed, you should instead write this:
> >       lock (obj) { ... @1 ...; wait(obj); } ... @2 ...
> >
> > 2.  I have a book titled "C# for the Java programmer", ISBN 0735617791.
> >     It says that are the same.
> >
> > 3.  Look at this URL.
> >       http://www.di.unipi.it/~boerger/Papers/CSharp/CsharpThread.pdf
> >     It is a excellent reference on C# threads.  I read with some
> >     amusement in the introduction:
> >       "A program developer has to rely solely on the class library
> >       documentation that comes with Microsoft s .NET framework Software
> >       Development Kit [11]. Unfortunately, that documentation is not
> >       very precise with respect to threads, locks and memory issues.
> >       ... For example, specifications of Thread.Interrupt,
> >       Thread.Suspend and Thread.Resume are not included in [5]."
> >       :
> >       [5] Common Language Infrastructure (CLI). Standard ECMA 335, 2001.
> >     Oh joy .. that does make life hard, doesn't it.  Anyway, near the
> >     top of page 17 this comment appears:
> >       "Injecting a ThreadAbortException or a ThreadInterruptedException
> >       into a thread means to create a new excpetion object and to force
> >       the thread to throw the exception (using Fail). If the thread is
> >       Syncing, Sleeping or Joined, its execution state is changed to
> >       Active in order that the exception can propagate upwards and
> >       probably terminate the thread. If the thread is Waiting, it is
> >       moved to the readyQueue and has to re-acquire the lock, since in
> >       this case the thread is still in a critical section of code and
> >       possible exception handlers and finally blocks should only be
> >       executed under the exclusive control of the monitor. If the thread
> >       is Pulsed, its execution state is not updated, since the thread
> >       has to re-acquire the lock before propagating the exception."
> >     You could do a lot worse than use this document as the spec for
> >     the PNet C# thread code.
> >
> > Have I convinced you?
> >
> > PS, I posted this to the developers list, as I think this discussion is
> > important.
> >
> 
> 
> _______________________________________________
> Developers mailing list
> [email protected]
> http://dotgnu.org/mailman/listinfo/developers
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.