I am reading the MCTS Self-Paced Training Kit (Exam 70-536): Microsoft .NET Framework—Application Development Foundation, Second Edition eBook.
Now I am finishing off the threading chapter (nr. 7). In the questions at the end of lesson 2, the is one question (nr. 2) that asks: “You are writing a method that can be run by multiple threads. Make sure that no thread writes to the file while any thread is reading from the file. But you have to do it as efficiently as possible with regard to multiple threads reading at the same time.”
Then there are two answers which are candidates for answers:
A.
lock(file)
{
// Read
}
and
D.
ReaderWriterLock rwl = new ReaderWriterLock();
rwl.AcquireReaderLock(10000);
// Read
rwl.ReleaseReaderLock();
The subtle hint in the question that “it has to be efficient for multiple reads” of course means they want you to use the ReaderWriterLock, but then I thought: “Creating a new instance of the ReaderWriterLock inside the method you are locking shouldn’t work, every call to the method will lock a different instance of ReaderWriterLock.”
However in the answers it says: D.
So IMHO this is an error in the book. They probably meant in the code sample that the new instance would be created somewhere else. If I would get this question on the exam, I would have gotten it wrong (I would choose A).
Your observation is correct, granted that the
ReaderWriterLockis indeed created within the method body. For the locking to work as expected, all threads need to use the sameReaderWriterLockinstance.If the code sample in your question is the full code listing for the answer I would say that it is presented in a rather bad way, and it may very well lead people to select the wrong answer because they did a fairly thorough analysis of the given code samples.