Nice link, Thanks!
Still toying around with my joke of a test program and I think I discovered
another interesting side effect of this attribute. It seems to not only lock
the current method but also any other methods marked with this attribute in
the object.
MethodA() manipulates dataX
MethodB() manipulates dataX
MethodC() manipulates dataY
Each method has the [MethodImpl(MethodImplOptions.Synchronized)] attribute.
And I start 3 threads (one thread calls MethodA etc). I found that the order
is Thread1, Thread2 then Thread3. So it looks like Thread1 put a lock on all
three methods. If I remove the attribute from Method3 then the order changes
to Thread3, Thread1, Thread2. If I remove all the attributes the order
varies and I can get errors (trying to remove some data that doesn't exist
yet).
I'm starting to understand why this isn't a good thing. I think we are
better off with a more granular locking mechanism using the lock().
Scott
"Jon Skeet [C# MVP]" <sk***@pobox.com> wrote in message
news:MP************************@msnews.microsoft.c om...
Seeker <my**********@hotmail.com> wrote: I've read conflicting posts about
[MethodImpl(MethodImplOptions.Synchronized)]. Does it or does it not
lock the entire object? In my simple test it appears to block just the method
but I wouldn't exactly call my meager test conclusive...
It's the equivalent to putting lock(this) round the whole method call.
Here's some code to indicate that:
using System;
using System.Runtime.CompilerServices;
using System.Threading;
class Test
{
static void Main()
{
new Test().Run();
}
[MethodImpl(MethodImplOptions.Synchronized)]
void Run()
{
Monitor.Pulse(this);
}
}
Compile and run it - it's fine. Comment out the attribute and it fails
though, because the thread doesn't own the monitor for "this" without
the attribute.
I wouldn't suggest using the attribute though - I'd use an explicit
lock. I also wouldn't lock on "this" - see
http://www.pobox.com/~skeet/csharp/t...ckchoice.shtml
--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too