2012-03-12 3 views
0

큰 int 배열로 저장된 이미지 데이터와 함께 실시간 이미지 처리를 수행하는 Java 응용 프로그램이 있습니다.배열에 스레드가 안전하지 않은 경우 허용

이미지 배열의 일부에 대한 업데이트가 여러 스레드에서 끊임없이 발생합니다 (이는 기본적으로 들어오는 이벤트의 매우 높은 볼륨 스트림을 시각화하기위한 것입니다).

독자는 표시 및/또는 추가 처리를 위해 이미지 배열의 일부 사본을 가져와야합니다.

높은 처리량이 필요하기 때문에 동시 액세스를 처리하기 위해 비싼 동기화를 피하고 싶습니다. 또한 가끔 작은 시각적 오류가 허용 될 수 있습니다 (예 : 리더가 주어진 들어오는 이벤트에 대해 부분적으로 만 업데이트 된 이미지 섹션을 복사하는 경우 기본적으로 스레드의 안전을 최대화하여 최대 처리량을 보장합니다.

이 방법이 효과가 있습니까? 내가 알아야 할 문제가 있니?

+1

가 일하러가는 어떤 방식인가? 동기화를 '긴장'하고 싶다고 말하지만, 완전히 제거하는 것처럼 들립니다. 그런 다음 동기화없이 다중 스레드 코드를 갖는 모든 알려진 문제점에 봉착하게됩니다 (스레드가 서로의 작업을 덮어 쓰는 등) – Thomas

답변

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); 
    } 
    } 
} 
관련 문제