2

Please bear with me on this as I'm new to this.

I have an array and two threads.

First thread appends new elements to the array when required

myArray ~= newArray;

Second thread removes elements from the array when required:

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

Is this thread safe? What happens when the two threads interact on the array at the exact same time?

4

3 に答える 3

4

いいえ、スレッドセーフではありません。スレッド間でデータを共有する場合は、同期ステートメント同期関数、、ミューテックスcore.atomicなどの機能を使用して、データをスレッドセーフにする必要があります。

ただし、指摘する必要があるもう1つの重要な点は、Dのすべてのデータがデフォルトでスレッドローカルであるということです。したがって、明示的に共有されていない限り、スレッド間でデータにアクセスすることはできません。したがって、通常はスレッドセーフについてまったく心配する必要はありません。問題になるのは、データを明示的に共有する場合のみです。

于 2012-04-12T20:39:31.887 に答える
2

これはスレッドセーフではありません

これには、古典的な失われた更新の競争があります:

追加とは、配列をインプレースで拡張できるかどうかを調べることを意味します。そうでない場合は、コピーがビジー状態のときに(O(n)時間)コピーを作成する必要があり、他のスレッドはピースをスライスできます。コピーが完了すると、ピースが返されます

スレッドセーフにするのが簡単なリンクリストの実装を使用することを検討する必要があります

Javaは、ここで説明されConcurrentLinkedQueueているリストを実装に使用しており、標準ライブラリので実装できます。core.atomic.cas()

于 2012-04-12T11:23:49.607 に答える
2

スレッドセーフではありません。synchronizedこれを修正する最も簡単な方法は、配列操作をブロックで囲むことです。詳細はこちら:http ://dlang.org/statement.html#SynchronizedStatement

于 2012-04-12T12:17:02.023 に答える