数组中的线程安全容器

时间:2010-02-03 23:03:31

标签: multithreading

任何人都可以解释一下,是否通过多个线程访问数组,其中每个线程正在处理数组的不同元素。

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

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

感谢 附:感兴趣的主要语言是c#或java,python但我会喜欢来自深奥语言专家的任何其他输入

2 个答案:

答案 0 :(得分:2)

如上所述,这是线程安全的,前提是数组中的每个项目都是不相互交互的不同对象。

绝对可以肯定,在线程工作时不要在数组中添加或删除项目。

答案 1 :(得分:2)

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

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

最好将工作作为单独的数据变量推送到线程中,并在事后“组合”你的数组。