有关.NET中多线程的一些新手问题,我认为这些问题将有助于巩固我试图吸收的一些概念-我已经阅读了几本多线程 Material (包括Albahari电子书),但觉得我只需要对一些问题进行一些确认帮助将这些概念带回家
由于这是两个可能影响同一变量的代码的不同区域,我们是否通过针对变量x周围的两个锁定范围使用相同的锁定变量来锁定两个代码区域来解决此问题?如果您使用不同的锁定变量锁定了代码的两个区域,这将不能正确保护变量?
锁变量的不同选择如何影响锁的行为/范围,以及在哪些情况下使用一个而不是另一个方案有意义?
感谢提供的所有启发式方法,对我来说,这些概念将有所帮助-谢谢!
最佳答案
1)
你是对的。您必须使用相同的锁定对象来保护两个不同的代码区域,例如,使变量x递增。
2)
这被称为死锁,是多线程编程的困难之一。有一些可用于防止死锁的算法,例如Bankers算法。
3)
某些语言使锁定变得容易,例如,在.Net中,您可以仅创建一个对象并将其用作共享锁。这对于在给定进程中同步代码很有用。 Lock(this)只是将锁应用于有问题的对象。但是,请尝试避免这种情况,而是创建一个私有(private)对象并使用它。锁定(此)可能导致死锁情况。下面的锁定对象可能只是关键部分的包装。如果要跨不同的进程保护资源,则需要重得多的名为Mutex的文件,这需要锁定内核对象并且很昂贵,因此除非必要,否则不要使用。
4)您还需要确保在那里也应用了锁定。但是可以肯定的是,当人们在此引用上调用方法时,他们会调用采用同步的方法。