2012-03-12 18 views
0

大規模な配列に格納されたイメージデータを使用して、リアルタイムの画像処理を実行するJavaアプリケーションがあります。配列にスレッドセーフではない

イメージ配列の一部の更新は、常に複数のスレッドから発生しています(これは、受信イベントの非常に大きなボリュームストリームの視覚化のためのものです)。

読者は表示および/またはそれ以上の処理のためにイメージアレイの一部のコピーを取る必要があります。

高スループットが必要なため、同時アクセスを処理するために高価な同期を避けたいと考えています。さらに、ときおり小さな視覚的誤差が許容され得る。リーダが、特定の着信イベントに対して部分的にしか更新されていないイメージのセクションをコピーする場合。基本的には、最大のスループットを確保するためにスレッドの安全性を緩和することです。

このアプローチは機能しますか?私が知っておくべきことは何ですか?

+1

は仕事に行く何のアプローチですか?同期を「リラックス」したいと言っていますが、完全に削除するように思えます。次に、同期なしでマルチスレッド化されたコードを持つ既知の問題(スレッドがお互いの作業を上書きするなど)を実行します。 – Thomas

答えて

1

おそらく、アレイをパーティション化し、各パーティションにアクセスするスレッドを1つだけ許可することを提案しています。これは問題のない合理的なアプローチです。

実際、フォーク/ジョインのフレームワークはこれを行い、あなたが達成しようとしているものにも適用可能です。

配列をソートする例を示すjava.util.concurrent.RecursiveActionのjavadocsを見てください。要するに、パーティションのサイズがしきい値を下回るまで、アレイは分割されます。後続のパーティションのそれぞれは、再度(すなわち、再帰的に)分割される。

コードは次のようになります。

class SortTask extends RecursiveAction { 
    final long[] array; final int lo; final int hi; 
    SortTask(long[] array, int lo, int hi) { 
    this.array = array; this.lo = lo; this.hi = hi; 
} 

protected void compute() { 
    if (hi - lo < THRESHOLD) 
     sequentiallySort(array, lo, hi); 
    else { 
     int mid = (lo + hi) >>> 1; 
     invokeAll(new SortTask(array, lo, mid), 
       new SortTask(array, mid, hi)); 
     merge(array, lo, hi); 
    } 
    } 
} 
関連する問題