2010-02-03 75 views
2

任何人都可以请解释一下,无论是多线程访问数组,其中每个线程都在数组的不同元素上工作。数组中的线程安全容器

所以有n个元素和n个线程==> 第n个线程正在处理数组的第n个元素?

任何一个都可以解释这是否安全?为什么或为什么不?

谢谢 p.s.感兴趣的主要语言c#或Java,python,但我会喜欢深奥语言专家的任何其他输入

+1

你为什么要这么做?这是为了什么目的? – 2010-02-03 23:06:03

+0

我在每个线程上执行一个SOAP over HTTP调用 - 如果我正在主线程中执行它,那么,由于线程正在等待“n”个http响应,所以我面临性能问题。 在上面的场景中,每个线程都是独立的 - 并且最小化我的程序的最长响应时间而不是响应总和 的任何输入? – bushman 2010-02-03 23:21:03

回答

2

在大多数语言中,这将是安全的(假设您一次只在一个线程内使用任何特定的数组元素) - 但这不是一个好主意。

主要问题是虚假分享。通过从多个线程写入数组中的项目,您会得到非常非常差的性能,因为您不断交换缓存行。在C#和Java等托管语言中,这是一个特别糟糕的主意。例如,在C#中,CLR会对数组进行边界检查。这会导致任何数组访问权限访问存储在数组的第一个元素之前的变量(长度),这会不断导致缓存未命中发生。一个很好的演示是通过Igor Ostrovsky at PDC完成的 - 你可以看到并行性能比由于这个问题而连续处理它慢很多倍。

将工作作为单独的数据变量推入线程是更好的主意,并且在事实之后“编写”您的数组。

+0

谢谢你的输入里德。我刚刚刚刚读到关于缓存垃圾的问题,但直到您提到之前,未能将这些点连接起来。我敢打赌,我分配的要求将会更好地服务于线程,而不是串行。我将线程的数量限制在很小的数量。 非常感谢你 – bushman 2010-02-03 23:48:12

+0

是的,如果你正在做每个线程的HTTP调用,它可能无所谓... – 2010-02-03 23:54:10

2

如上所述,这是线程安全的,只要数组中的每个项目都是不与对象交互的彼此。

要绝对肯定,在线程正在工作时不要添加或移除数组中的项目。