JDK의 동시성 패키지 인 Boost의 쓰레드 라이브러리, Perl의 쓰레드 라이브러리 (파이썬이 아닌)는 모두 장벽을 구현하고 있기 때문에 장벽을 사용할 필요가 없다. 그래서 멀티 쓰레드 애플리케이션에서 전형적인 유스 케이스가 될지 궁금하다. .멀티 스레드 응용 프로그램에서 장벽을 사용하는 실제 세계의 예는 무엇입니까?
답변
장벽은 인위적인 예제를 통해 모든 곳에서 사용할 수 있지만 진행하기 전에 다른 스레드의 결과가 모두 필요한 곳에서는 종종 분산/축소 방법으로 보입니다.
예를 들어 정렬을 병렬 처리하려면 목록을 n 번 나누고 n 개의 스레드를 시작하여 섹션을 정렬하고 일시 중지하십시오. 모두 완료되면 부모가 마침내 조합이 가능하다는 것을 알게되면 죽을 것입니다 정렬 된 청크. (나는 더 나은 방법이 있다는 것을 알고 있지만 그것은 하나의 구현 임).
내가 본 다른 곳은 병렬 네트워킹입니다. 은 페이로드 당 일정량의 데이터를 보내려면입니다. 따라서 인터페이스는 버킷을 시작하여 전송을 보내기 전에 모두 버킷을 채울 때까지 대기합니다. 분할 된 T1 라인에 대해서 생각해 보면, 64 개의 다중화 된 파티션을 통해 하나의 데이터 버스트를 전송하는 것은 1 개의 파티션의 데이터를 보내는 것보다 낫습니다. (패킷은 0으로 패딩되어야하기 때문에 기본적으로 비용이 같습니다.)
희망 사항은 문제에 대해 생각할 수있는 몇 가지 사항입니다.
예 : 스레드 세트가 결과 세트를 계산하기 위해 동시에 작동하고 결과 세트 (부분/장벽".
장벽은 여러 개의 스레드 주위에 솔루션을 만들지 않고도 여러 스레드를 동기화하는 것을 더 쉽게 만듭니다. conditions
& mutexes
.
나는 종종 barriers
을 보았다고 말할 수 없다. 어떤 시점에서 스레드 수가 증가하면 가능한 "dead-locks"를 관리하는 데있어보다 "분리 된"시스템을 고려하는 것이 좋습니다.
MSDN : 모든 작업이 장벽에 도달 할 때까지 병렬 작업에서 개별 작업이 계속되지 않도록하는 개체입니다. 단계에서 병렬 작업이 발생하고 각 단계에서 작업간에 동기화가 필요한 경우에 유용합니다.