6

インスタンスのコレクションBufferedImage、1 つのメイン イメージ、およびメイン イメージを呼び出すことによって作成されたいくつかのサブイメージがありgetSubImageます。サブイメージは重なりません。サブイメージにも変更を加えており、これをサブイメージごとに 1 つずつ複数のスレッドに分割したいと考えています。

BufferedImageどのように 、Rasterおよび動作するかについての私の理解からDataBuffer、これは次の理由で安全であるはずです。

  • BufferedImage(およびそれぞれのWritableRasterと)の各インスタンスは、SampleModel1 つのスレッドからのみアクセスされます。
  • 共有ColorModelは不変です
  • にはDataBuffer変更できるフィールドはありません (変更できるのはバッキング配列の要素だけです)。
  • 別々のスレッドで配列のばらばらなセグメントを変更することは安全です。

ただし、これを行うことが間違いなく安全であると述べているドキュメントは見つかりません。安全であると仮定できますか?child のコピーで作業できることはわかっていますがRaster、メモリの制約があるため、これは避けたいと思います。

それ以外の場合、親イメージの領域をコピーせずに操作をスレッドセーフにすることは可能ですか?

4

4 に答える 4

4

「サブイメージ」をタイルとして管理するために JAI を使用することを検討しましたか? 元の画像の BufferedImage インスタンスとそのすべての subImage BufferedImage インスタンスに固執する必要がない場合は、リソースをより有効に使用できるようです。JAI に関する情報は、次の場所にあります: JAI README

RenderedImage インターフェースを実装するクラス TiledImage があります (それに BufferedImage との共通の祖先を与えます)。JAIのドキュメントによると:

タイリングを使用すると、計算に複数のスレッドを使用することも容易になります。以前に割り当てられたタイルを再利用して、メモリを節約することもできます。

BufferedImage はイメージ全体のイメージ スナップショットをメモリ内に保持するため、RenderedImage のこれらの実装のいずれかを使用することは、多くの場合、BufferedImage よりも優先されます。JAI はレンダリング チェーンを使用し、メモリの制約に合わせて必要に応じてタイルを再利用できます。

于 2010-05-21T17:58:57.153 に答える
2

それは良い分析であり、私には正しいように思えます。共有データがないため、同時アクセスは問題ないはずです。ただし、それが機能するはずであるという知識に基づいた推測以上に、何らかの保証が必要です。「BufferedImage は同時に使用されるように設計されている」というステートメントを見つけたとしても、これが実際に当てはまるという保証はありません。

できる限り確実にするために、ConTestを使用して並行単体テストを作成できます。同時実行テスト ハーネスは、コードを計測し、人為的に誘発されたコンテキスト スイッチを挿入して、同時実行のバグを明らかにします。これにより、BufferedImage コードと独自のコードがテストされるため、スレッド セーフであることを確信できます。

于 2010-05-23T20:11:39.010 に答える
1

のスレッドセーフの明確な証拠は見つかりませんでしBufferedImageたが、おそらく次の方法で問題を解決できます。

異なるワーカーによるサブイメージの同時処理の代わりに、すべてのワーカーが同じイメージの異なるサブイメージを消費する方法で多くのイメージを処理するようにしてください。同じワーカーが同じイメージのサブイメージを順番に処理します。

残りのワーカーよりも画像が少なくなるまで、ワーカーは忙しくなります。

この問題を元に戻します。

        W1 W2 W3
Img1 | ------- | ------- | ------- |
        W1 W2 W3
Img2 | ------- | ------- | ------- |
に:

        W1 W1 W1
Img1 | ------- | ------- | ------- |
        W2 W2 W2
Img2 | ------- | ------- | ------- |
    
于 2010-05-21T11:14:53.863 に答える
0

これらの回答のどれも (十分に) 満たすものがない場合は、重い (?) 価格で決定的に問題を解決する何かを行うことができます。

BufferedImage、DataBuffer、Raster などのソースを調べます。これが唯一の方法です。

于 2010-05-23T22:50:56.627 に答える