동기화 장벽
동기화 장벽을 사용하면 스레드가 계속되기 전에 모든 스레드가 특정 실행 지점에 도달할 때까지 여러 스레드가 대기할 수 있습니다. 동기화 장벽은 프로세스 간에 공유할 수 없습니다.
동기화 장벽은 동일한 코드를 병렬로 실행하는 스레드가 다음 단계로 넘어가기 전에 한 단계를 모두 완료해야 하는 단계별 계산에 유용합니다.
동기화 장벽을 만들려면 InitializeSynchronizationBarrier 함수를 호출하고 최대 스레드 수와 스레드가 차단되기 전에 회전해야 하는 횟수를 지정합니다. 그런 다음 장벽을 사용할 스레드를 시작합니다. 각 스레드가 작업을 완료한 후 EnterSynchronizationBarrier 를 호출하여 장벽에서 기다립니다. EnterSynchronizationBarrier 함수는 장벽에서 차단된 스레드 수가 장벽의 최대 스레드 수에 도달할 때까지 각 스레드를 차단합니다. 이때 EnterSynchronizationBarrier는 모든 스레드의 차단을 해제합니다. EnterSynchronizationBarrier 함수는 장벽에 진입한 스레드 중 하나에 대해 TRUE를 반환하고 다른 모든 스레드에 대해 FALSE를 반환합니다.
더 이상 필요하지 않은 동기화 장벽을 해제하려면 DeleteSynchronizationBarrier를 호출합니다. EnterSynchronizationBarrier를 호출한 직후에 이 함수를 호출하는 것이 안전합니다. 이 함수는 해제되기 전에 모든 스레드가 장벽 사용을 완료하도록 하기 때문입니다.
동기화 장벽이 삭제되지 않으면 스레드는 장벽에 들어갈 때 SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE 플래그를 지정할 수 있습니다. 장벽을 사용하는 모든 스레드는 이 플래그를 지정해야 합니다. 스레드가 없으면 플래그가 무시됩니다. 이 플래그를 사용하면 함수가 삭제 안전에 필요한 추가 작업을 건너뛰어 성능을 향상시킬 수 있습니다. 이 플래그가 적용되는 동안 장벽을 삭제하면 핸들 액세스가 잘못되고 하나 이상의 스레드가 영구적으로 차단될 수 있습니다.