D中阵列的线程安全性?

时间:2012-04-12 10:41:54

标签: multithreading thread-safety d

请关注我,因为我是新手。

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

第一个线程在需要时将新元素附加到数组

myArray ~= newArray;

第二个线程在需要时从数组中删除元素:

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

这个线程安全吗? 当两个线程在同一时间在阵列上交互时会发生什么?

3 个答案:

答案 0 :(得分:4)

不,是线程安全的。如果您跨线程共享数据,那么您需要通过synchronized statementssynchronized functionscore.atomicmutexes等工具来处理自己的线程安全。

然而,需要指出的另一个主要问题是D中的所有数据都是默认的线程本地。因此,除非明确shared,否则无法跨线程访问数据。因此,您通常不必担心线程安全。只有在您明确共享数据时才会出现问题。

答案 1 :(得分:2)

这不是线程安全的

这有经典的失败更新比赛:

appending意味着对数组进行examening以查看它是否可以就地扩展,如果不是它需要在复制繁忙时进行(O(n)次)复制,另一个线程可以切片并且当复制时完成那件将返回

你应该考虑使用更容易使线程安全的链表实现

Java的ConcurrentLinkedQueue使用列表described here进行实现,您可以使用标准库中的core.atomic.cas()来实现它

答案 2 :(得分:2)

它不是线程安全的。解决此问题的最简单方法是使用synchronized块来围绕阵列操作。更多相关信息:http://dlang.org/statement.html#SynchronizedStatement