views:

56

answers:

2

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).

+4  A: 

Your observation is correct, granted that the ReaderWriterLock is indeed created within the method body. For the locking to work as expected, all threads need to use the same ReaderWriterLock instance.

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.

Fredrik Mörk
+2  A: 

That kit is historically famously full of errors, with errata here. If it helps, the first edition had not 1, not 2, not 3 but 4 erratas. You did well to spot it, but you should be very cautious here, and indeed try to verify anything you are not 100% sure of.

Marc Gravell