请关注我,因为我是新手。
我有一个数组和两个线程。
第一个线程在需要时将新元素附加到数组
myArray ~= newArray;
第二个线程在需要时从数组中删除元素:
extractedArray = myArray[0..10];
myArray = myArray[10..myArray.length()];
这个线程安全吗? 当两个线程在同一时间在阵列上交互时会发生什么?
答案 0 :(得分:4)
不,不是线程安全的。如果您跨线程共享数据,那么您需要通过synchronized statements,synchronized functions,core.atomic
和mutexes等工具来处理自己的线程安全。
然而,需要指出的另一个主要问题是D中的所有数据都是默认的线程本地。因此,除非明确shared,否则无法跨线程访问数据。因此,您通常不必担心线程安全。只有在您明确共享数据时才会出现问题。
答案 1 :(得分:2)
这不是线程安全的
这有经典的失败更新比赛:
appending意味着对数组进行examening以查看它是否可以就地扩展,如果不是它需要在复制繁忙时进行(O(n)次)复制,另一个线程可以切片并且当复制时完成那件将返回
你应该考虑使用更容易使线程安全的链表实现
Java的ConcurrentLinkedQueue
使用列表described here进行实现,您可以使用标准库中的core.atomic.cas()
来实现它
答案 2 :(得分:2)
它不是线程安全的。解决此问题的最简单方法是使用synchronized
块来围绕阵列操作。更多相关信息:http://dlang.org/statement.html#SynchronizedStatement