有关.NET中多线程的一些新手问题,我认为这些问题将有助于巩固我试图吸收的一些概念-我已经阅读了几本多线程 Material (包括Albahari电子书),但觉得我只需要对一些问题进行一些确认帮助将这些概念带回家

  • 锁定范围可保护代码的共享区域-假设有一个线程正在执行在循环中递增简单整数变量x的方法-但是,这不会保护可能会更改变量x的其他地方的代码,例如,另一种方法中的另一种方法线 ...

    由于这是两个可能影响同一变量的代码的不同区域,我们是否通过针对变量x周围的两个锁定范围使用相同的锁定变量来锁定两个代码区域来解决此问题?如果您使用不同的锁定变量锁定了代码的两个区域,这将不能正确保护变量?
  • 为了进一步说明该示例,使用相同的锁定变量,如果由于某种原因,一个方法中的代码进入无限循环而从不放弃锁定变量,将会发生什么?另一种方法中的代码的第二个区域如何检测到这一点呢?
  • 选择锁变量如何影响锁的行为?我已经读过很多关于该主题的文章,但似乎无法找到明确的答案-在某些情况下,人们为此目的明确地使用对象变量,而在其他情况下,人们则使用lock(this),最后有时我已经看到人们使用类型对象。

    锁变量的不同选择如何影响锁的行为/范围,以及在哪些情况下使用一个而不是另一个方案有意义?
  • 假设您在类中包装了一个哈希表,该类暴露了add,remove,get和某种Calculate方法(例如,每个对象代表一个数量,并且该方法将每个值相加),并且所有这些方法均被锁定-但是,一旦引用了该集合中的对象可用于其他代码并传递给应用程序,该对象(而不是哈希表)现在将位于该类方法周围的锁定范围之外..那么您如何保护对这些实际对象的访问/更新从哈希表中获取,这可能会干扰Calculate方法?

  • 感谢提供的所有启发式方法,对我来说,这些概念将有所帮助-谢谢!

    最佳答案

    1)
    你是对的。您必须使用相同的锁定对象来保护两个不同的代码区域,例如,使变量x递增。

    2)
    这被称为死锁,是多线程编程的困难之一。有一些可用于防止死锁的算法,例如Bankers算法。

    3)
    某些语言使锁定变得容易,例如,在.Net中,您可以仅创建一个对象并将其用作共享锁。这对于在给定进程中同步代码很有用。 Lock(this)只是将锁应用于有问题的对象。但是,请尝试避免这种情况,而是创建一个私有(private)对象并使用它。锁定(此)可能导致死锁情况。下面的锁定对象可能只是关键部分的包装。如果要跨不同的进程保护资源,则需要重得多的名为Mutex的文件,这需要锁定内核对象并且很昂贵,因此除非必要,否则不要使用。

    4)您还需要确保在那里也应用了锁定。但是可以肯定的是,当人们在此引用上调用方法时,他们会调用采用同步的方法。

    10-02 05:44