저는 Java로 동시 프로그래밍을 배우고 Game of Life에 대한 시뮬레이션을 작성하고 있습니다. 여기 Conway의 국경 세포에서의 경합 게임을위한 다중 스레드 Java 프로그램
내가 생각하고 무엇을 :- 사용 INT는 [] [] 세포의 상태를 저장
- 파티션 t 세그먼트에 INT [] []와 t 작업자 스레드를 사용하는
- t 스레드는 세그먼트에서 읽고 세그먼트의 모든 셀에 대해 새 값을 계산하고 셀을 업데이트합니다.
- 계산이 끝나면 다른 근로자가 완료 할 수있는 장벽을 기다립니다.
- 장벽을 넘으면 기본 스레드가 UI를 업데이트합니다.
- 근로자는 다음 상태를 계산하기 위해 진행합니다.
이제 세그먼트의 공통 경계에서 경합이 발생합니다. 스레드가 이전 값을 읽기 전에 경계 셀의 상태를 덮어 쓰면 이웃의 계산이 잘못 될 것입니다.
내 옵션에는 어떤 것이 있습니까?
- runnable 대신 callable을 사용하고 작업자 스레드가 새 값을 반환하도록합니다 (세그먼트 자체를 업데이트하는 대신). 주 스레드는 장벽을 넘은 후 행렬을 업데이트 할 수 있습니다. 이 옵션에는 작업자 스레드가 반환 한 결과를 행렬에 복사하는 작업이 포함됩니다.
- 두 개의 장벽을 사용하십시오. 작업자 스레드는 인접 셀 세그먼트의 테두리 셀 복사본을 만들고 첫 번째 장벽을 기다립니다. 이 장벽이 통과되면 다음 상태를 계산하고 세그먼트를 제자리에서 업데이트합니다. 그런 다음 그들은 두 번째 장벽에서 기다립니다. 주 스레드가 UI를 업데이트합니다.
내 질문은 복사 된 데이터를 포함하거나 그 위의 두 가지 옵션이 더 효율적입니다하지 않습니다 경계 세포 에서 경쟁 다루는 다른 방법이있다? ReaderWriterLock, 휘발성 변수 또는 다른 동기화 메커니즘을 사용하고 있습니까?
업데이트 : 지금까지 double buffering solution by Peter이 가장 깨끗합니다. 그러나 나는 질문이있다. 두 배열이 공유 데이터이고 동기화 (동기화 된 액세스 또는 휘발성 변수)를 사용하지 않으므로 가시성 문제가 발생하지 않습니까?? 여러 CPU가 배열 값을 캐시하고 각 반복마다 배열의 일부만 업데이트 할 수 있습니까? 그런 다음 스레드는 테두리 셀에 오래된 값을 가져옵니다. 이것이 가능한가? 그렇지 않다면, 왜. 그렇다면 어떻게 해결할 수 있습니까? declaring two arrays volatile will not make their individual elements volatile입니다.
일반적인 int 대신 AtomicInt를 사용하려고합니다. –
장점? 과도한 동기화가되지 않나요? – Helen
int를 사용해야하는 이유는 무엇입니까? boolean을 사용하여 저장하는 것이 더 논리적이고 효율적이지 않습니까? – Pool