문제

나는 C# 4.0을 집어 들고 있으며 나를 혼란스럽게하는 것 중 하나는 장벽 개념입니다.

이것은 단지 사용하는 것이 아닙니다 WaitAll 의 방법 WaitHandle? 모든 스레드가 끝날 때까지 기다리지 않습니까?

이 페이지에서 장벽 구성을 배웠습니다. http://www.managed-world.com/archive/2009/02/09/an-intro-to-barrier.aspx

그러나 그것은 똑같은 것 같습니다 WaitAll 방법. 내가 무엇을 놓치고 있습니까? 여기서 차이점은 무엇입니까?

감사.

도움이 되었습니까?

해결책

왜 waithandle + waitforall 파생물보다 장벽이 선호되는지 궁금한 것 같습니다. 둘 다 제대로 구조화되면 비슷한 목표를 달성 할 수 있습니다.

나는 Barrier에 매우 익숙하지 않지만 나에게 뛰어 넘는 장점 중 하나는 자원 문제입니다. N 스레드를 배리어와 동기화하려면 단일 배리어 인스턴스 만 필요합니다. Waithandle을 통해 N 스레드를 동기화하려면 N 핸들이 필요합니다. 이 리소스는 저렴하지만 무료는 아닙니다. 스레드 그룹을 동기화하기 위해 리소스 수를 줄이면 장점이 있습니다.

다른 팁

보다 장벽. 여러 스레드 그룹이 하나가 아닌 특정 지점에 도달하기를 기다립니다. 그것은 종종 과학 컴퓨팅 및 시뮬레이션에 사용되어 시간 "진드기"를 나타냅니다.

입방 마일의 공기를 나타내는 큐브의 1000 x 1000 x 1000 그리드를 상상해보십시오. 시간 제로에서 주어진 단위 큐브는 이웃의 온도 및 압력과 같은 다양한 매개 변수의 영향을받습니다. 모든 사람이 시간 1을 계산하면 시간 2에 대해 동일한 작업을 수행합니다 ... 날씨 시뮬레이션이됩니다. 핵 시뮬레이션에 대한 비슷한 이야기.

불리는 장벽의 변형도 있습니다 사이클리 배저 시작 라인에서 이륙하지 않은 스레드를 수락하고 시간이 지나면 그룹에 다시 참여하게합니다. C# 4의 장벽이 주기적 장벽인지 여부는 문서에서 명확하지 않지만 참가자보고.

Barrier 더 높은 수준의 추상화와 편의성을 제공합니다 : 단일 SignalAndWait 호출은 각 스레드가 필요한 모든 스레드입니다. 배열에서 어떤 핸들이 신호를 보내야하는지 (또는 뮤트를 사용하여 배열에서 사용 가능한 다음 지점을 찾아서 증분하고) 먼저 신호를 보내야합니다. 그리고 WaitAll.

물론 다른 동기화 메커니즘을 적절히 사용하여 동일한 동기화 작업을 수행 할 수 있지만 일반적인 사용 패턴에 대해서는 동일한 동기화 작업을 수행 할 수 있습니다. Barrier 구체적으로, 이미 편리하고 바보로 방해하는 솔루션을 이미 가지고 있고 깔끔하게 포장하는 것이 편리합니다 .-).

대기자는 Transact SQL 문입니다. 지정된 시간 또는 시간 간격에 도달 할 때까지 배치, 저장 프로 시저 또는 트랜잭션의 실행을 차단하거나 지정된 명령문이 하나 이상의 행을 수정하거나 반환합니다.

장벽은 주어진 지점에서 다수의 스레드 또는 프로세스 사이의 실행 중지를 시행하고 모든 스레드 또는 프로세서가 주어진 지점에 도달 할 때까지 추가 실행을 방지하는 동기화 프리미티브입니다.

Waitall을 언급하는 경우 Waitall은 waithandles 배열을 유지해야합니다. 그런 의미에서 장벽은 사용하기가 조금 간단합니다. 그러나 나는 두 가지 방법이 놀랍도록 비슷하다고 동의합니다.

주요 약점 기능 Waitall은 최대 핸들 한계입니다 (64 개의 핸들 만 사용할 수 있음) Waithandle의 해결 방법 64 핸들 제한?

나에게 계산 된 Waithandle처럼 보인다. "이 잠금을 기다리는 스레드의 수가 X가되면 모두 놓아 두십시오." 다른 구성으로 할 수없는 것은 아니지만 편리한 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top