2010-10-21 29 views
5

我正在閱讀MCTS Self-Paced培訓套件(考試70-536):Microsoft .NET Framework-應用程序開發基礎,第二版電子書。這是MCTS Self-Paced Training Kit(考試70-536)中的錯誤嗎?

現在我正在完成線程章節(nr。7)。在第2課結尾處的問題中,有一個問題(第2節)提出要求:「您正在編寫一個可以由多個線程運行的方法。確保在任何線程正在讀取時沒有線程寫入文件從文件中讀取,但是您必須儘可能有效地完成多線程同時讀取的操作。「

然後有兩個答案它們是候選答案: A.

lock(file) 
{ 
    // Read 
} 

D.

ReaderWriterLock rwl = new ReaderWriterLock(); 
rwl.AcquireReaderLock(10000); 
    // Read 
rwl.ReleaseReaderLock(); 

在討論的微妙暗示,「它有對多次讀取有效「當然意味着他們希望您使用ReaderWriterLock,但後來我想:」創建一個的新實例您正在鎖定的方法中的應該不起作用,每次調用方法都會鎖定ReaderWriterLock的不同實例。「

然而,在回答它說:D.

所以恕我直言,這是這本書的錯誤。它們在代碼示例中可能意味着新實例將在其他地方創建。如果我在考試中得到這個問題,我會錯誤的(我會選擇A)。

+0

我想他們的意思是RWL是在線程方法的範圍之外創建的...... – 2010-10-21 11:20:30

+0

代碼是否在答案D的整個列表上方? – Lazarus 2010-10-21 11:23:11

+0

@Tony:這也是我的想法,但他們沒有在答案中表明。 – 2010-10-21 11:24:54

回答

5

你的觀察是正確的,只要ReaderWriterLock確實在方法體內創建。要使鎖定按預期工作,所有線程都需要使用相同的ReaderWriterLock實例。

如果您的問題中的代碼示例是答案的完整代碼清單,我會說它以相當糟糕的方式呈現,並且很可能會導致人們選擇錯誤的答案,因爲它們做得相當徹底分析給定的代碼示例。

4

該套件歷史上是着名充滿了錯誤,與errata here。如果有幫助,第一版不是1,而是2,而不是3,但4 erratas。你很好地發現它,但你在這裏應該非常謹慎,確實試圖驗證你不是100%確定的。