我正在阅读MCTS Self-Paced Training Kit(考试70-536):Microsoft .NET Framework-Application Development Foundation,Second Edition eBook。
现在我完成了线程章节(第7节)。在第2课结束时的问题中,有一个问题(第2条)询问:“您正在编写一个可以由多个线程运行的方法。确保在任何线程正在读取时没有线程写入该文件从文件开始。但是你必须尽可能高效地同时进行多线程读取。“
然后有两个答案是答案的候选人: 甲
lock(file)
{
// Read
}
和
d
ReaderWriterLock rwl = new ReaderWriterLock();
rwl.AcquireReaderLock(10000);
// Read
rwl.ReleaseReaderLock();
“它必须对多次读取有效”的问题中的微妙暗示当然意味着他们希望您使用ReaderWriterLock
,但后来我想:“创建{{1的新实例在你锁定的方法内部不起作用,每次调用该方法都会锁定ReaderWriterLock
的不同实例。“
然而在答案中它说:D。
所以恕我直言这是书中的错误。它们可能在代码示例中意味着新实例将在其他地方创建。如果我在考试中得到这个问题,我就错了(我会选择A)。
答案 0 :(得分:5)
您的观察是正确的,因为ReaderWriterLock
确实是在方法体内创建的。为了使锁定按预期工作,所有线程都需要使用相同的ReaderWriterLock
实例。
如果您问题中的代码示例是答案的完整代码列表,我会说它以相当糟糕的方式呈现,并且很可能会导致人们选择错误的答案,因为他们做了相当彻底的分析给定的代码示例。
答案 1 :(得分:4)
该套件历来着名充满错误,errata here。如果有帮助,第一版不是1,不是2,不是3,而是4 erratas。你发现它很好,但你应该在这里非常谨慎,并且确实试图验证你不是100%肯定的任何东西。