2012-04-12 38 views
2

请耐心等待,因为我是新手。D中数组的线程安全性?

我有一个数组和两个线程。

extractedArray = myArray[0..10]; 
myArray = myArray[10..myArray.length()]; 

这是线程安全的:当需要

myArray ~= newArray; 

第二个线程删除该数组元素在需要时

第一线追加新的元素添加到数组? 当两个线程完全同时在阵列上交互时会发生什么?

回答

2

这不是线程安全的

这有经典的丢失更新种族:

附加装置examening数组,看它是否能就地扩大,如果不是需要做出(O( n)时间)副本,而副本繁忙时,另一个线程可以切片,当副本完成时,该片段将返回

您应该使用链接列表实现,以便更安全地使用线程

Java's ConcurrentLinkedQueue使用列表described here进行实施,您可以在标准库中使用core.atomic.cas()执行它

+0

谢谢你。 – ains 2012-04-12 11:26:40

2

它不是线程安全的。解决这个问题的最简单方法是用​​块来包围数组操作。更多关于它的地方:http://dlang.org/statement.html#SynchronizedStatement

+2

请注意,多个“同步”块(无表达式)不会彼此同步。 – 2012-04-12 23:21:59

+0

感谢您的信息。 – ains 2012-04-13 05:48:00

4

不,它是不是线程安全。如果您通过线程共享数据,则需要通过synchronized statements,synchronized functions,core.atomicmutexes等工具来处理线程安全问题。

但是,需要指出的另一件大事是,D中的所有数据默认是线程本地的。所以,你不能跨线程访问数据,除非明确shared。所以,你通常不必担心线程安全问题。只有当你明确地分享数据时,这是一个问题。

+0

感谢您的信息。 – ains 2012-04-13 05:48:09