数组和线程安全访问

2024-01-16

如果我有一个可以/将在任何给定时间点被多个线程访问的数组,到底是什么导致它是非线程安全的,以及确保该数组在大多数情况下是线程安全的步骤是什么情况?

我在互联网上进行了广泛的查找,发现几乎没有关于这个主题的信息,一切似乎都是特定的场景(例如,这个数组是由这两个线程线程安全地访问的,等等)。我真的希望有人可以回答我在顶部列出的问题,或者是否有人可以指出一份解释上述项目的好文件。

编辑: 在MSDN上查了一下,我发现了ArrayList类。当您使用同步方法时,它会返回给定列表的线程安全包装器。在列表中设置数据时(即 list1[someNumber] = anotherNumber;),包装器是否会自动锁定列表,还是仍然需要锁定它?


当两个线程访问完全相同的资源(例如,不是本地副本,而是实际上相同资源的相同副本)时,可能会发生很多事情。在最明显的情况下,如果线程 #1 正在访问资源并且线程 #2 在读取过程中更改了该资源,则可能会发生一些不可预测的行为。即使使用像整数这样简单的东西,也可能会出现逻辑错误,因此请尝试想象一下,如果不正确地使用更复杂的东西(例如声明为静态的数据库访问类),可能会导致多么可怕的后果。

处理此问题的经典方法是对敏感资源加锁,以便一次只有一个线程可以使用它。因此,在上面的示例中,线程 #1 会请求对资源的锁定并被授予该锁定,然后继续读取它需要读取的内容。线程 #2 会在读取过程中出现并请求对资源的锁定,但会被拒绝并被告知等待,因为线程 #1 正在使用它。当线程 #1 完成时,它会释放锁,线程 #2 就可以继续进行。

还有其他情况,但这说明了最基本的问题和解决方案之一。在 C# 中,您可以:

1) 使用由框架管理为可锁定的特定 .NET 对象(如 Scorpion-Prince 的链接到 SynchronizedCollection http://msdn.microsoft.com/en-us/library/ms668265.aspx)

2) Use [MethodImpl(MethodImplOptions.Synchronized)] http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.methodimploptions.aspx规定执行危险操作的特定方法一次只能由一个线程使用

3)使用锁语句 http://msdn.microsoft.com/en-us/library/c5kehkcz%28v=vs.71%29.aspx隔离正在执行潜在危险操作的特定代码行

哪种方法最好取决于您的具体情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组和线程安全访问 的相关文章