다음을 통해 공유


동기화 데이터 구조

동시성 런타임은 여러 스레드의 공유 데이터에 대한 액세스를 동기화할 수 있는 여러 데이터 구조를 제공합니다. 이러한 데이터 구조는 자주 수정하지 않는 공유 데이터가 있는 경우에 유용합니다. 동기화 개체(예: 중요한 섹션)를 사용하면 공유 리소스를 사용할 수 있게 될 때까지 다른 스레드가 대기합니다. 따라서 이러한 개체를 사용하여 자주 사용되는 데이터에 대한 액세스를 동기화하는 경우 애플리케이션의 확장성이 손실될 수 있습니다. PPL(병렬 패턴 라이브러리)동시성::결합 가능한 클래스를 제공하므로 동기화할 필요 없이 여러 스레드 또는 태스크 간에 리소스를 공유할 수 있습니다. 클래스에 대한 combinable 자세한 내용은 병렬 컨테이너 및 개체를 참조 하세요.

섹션

이 항목에서는 다음과 같은 비동기 메시지 블록 형식에 대해 자세히 설명합니다.

critical_section

동시성::critical_section 클래스는 선점하는 대신 다른 작업에 생성하는 협조적 상호 배제 개체를 나타냅니다. 중요한 섹션은 여러 스레드에서 공유 데이터에 대한 단독 읽기 및 쓰기 액세스 권한이 필요한 경우에 유용합니다.

클래스는 critical_section 재진입하지 않습니다. 동시성::critical_section::lock 메서드는 이미 잠금을 소유하고 있는 스레드에서 호출되는 경우 동시성::improper_lock 형식의 예외를 throw합니다.

메서드 및 기능

다음 표에서는 클래스에서 정의한 중요한 메서드를 보여 줍니다 critical_section .

메서드 설명
lock 중요한 섹션을 가져옵니다. 호출 컨텍스트는 잠금을 획득할 때까지 차단됩니다.
try_lock 중요한 섹션을 가져오려고 시도하지만 차단하지는 않습니다.
unlock 중요한 섹션을 해제합니다.

[맨 위로 이동]

reader_writer_lock

동시성::reader_writer_lock 클래스는 공유 데이터에 스레드로부터 안전한 읽기/쓰기 작업을 제공합니다. 여러 스레드에서 공유 리소스에 대한 동시 읽기 권한이 필요하지만 해당 공유 리소스에 거의 쓰지 않는 경우 판독기/기록기 잠금을 사용합니다. 이 클래스는 언제든지 하나의 스레드 쓰기 액세스 권한만 개체에 제공합니다.

개체가 reader_writer_lock 공유 리소스에 critical_section 대한 단독 액세스를 획득하여 동시 읽기 액세스를 방지하므로 클래스가 클래스 critical_section 보다 더 나은 성능을 발휘할 수 있습니다.

클래스와 critical_section 마찬가지로 클래스는 reader_writer_lock 선점하는 대신 다른 작업에 대해 생성하는 협조적 상호 배제 개체를 나타냅니다.

공유 리소스에 기록해야 하는 스레드가 판독기/기록기 잠금을 획득하면 기록기가 잠금을 해제할 때까지 리소스에 액세스해야 하는 다른 스레드도 차단됩니다. 이 reader_writer_lock 클래스는 대기 중인 판독기를 차단 해제하기 전에 대기 중인 기록기를 차단 해제하는 잠금인 쓰기 기본 설정 잠금의 예입니다.

클래스와 critical_section 마찬가지로 클래스는 reader_writer_lock 재진입하지 않습니다. 동시성::reader_writer_lock::lock동시성::reader_writer_lock::lock_read 메서드는 잠금을 이미 소유하고 있는 스레드에서 호출되는 경우 형식 improper_lock 예외를 throw합니다.

참고 항목

클래스는 reader_writer_lock 재진입자가 아니므로 읽기 전용 잠금을 판독기/기록기 잠금으로 업그레이드하거나 읽기/기록기 잠금을 읽기 전용 잠금으로 다운그레이드할 수 없습니다. 이러한 작업 중 하나를 수행하면 지정되지 않은 동작이 생성됩니다.

메서드 및 기능

다음 표에서는 클래스에서 정의한 중요한 메서드를 보여 줍니다 reader_writer_lock .

메서드 설명
lock 잠금에 대한 읽기/쓰기 권한을 획득합니다.
try_lock 잠금에 대한 읽기/쓰기 액세스를 가져오려고 시도하지만 차단하지는 않습니다.
lock_read 잠금에 대한 읽기 전용 액세스를 획득합니다.
try_lock_read 잠금에 대한 읽기 전용 액세스를 가져오려고 시도하지만 차단하지는 않습니다.
unlock 잠금을 해제합니다.

[맨 위로 이동]

scoped_lock 및 scoped_lock_read

reader_writer_lock 클래스는 critical_section 상호 제외 개체로 작업하는 방식을 간소화하는 중첩된 도우미 클래스를 제공합니다. 이러한 도우미 클래스를 범위가 지정된 잠금이라고 합니다.

클래스에는 critical_section 동시성::critical_section::scoped_lock 클래스가 포함됩니다. 생성자는 제공된 critical_section 개체에 대한 액세스를 획득합니다. 소멸자는 해당 개체에 대한 액세스를 해제합니다. 클래스에는 reader_writer_lock 동시성::reader_writer_lock::scoped_lock 클래스가 포함됩니다. 이 클래스는 제공된 reader_writer_lock 개체에 대한 쓰기 액세스를 관리한다는 점을 제외하고 유사critical_section::scoped_lock합니다. 클래스에는 reader_writer_lock 동시성::reader_writer_lock::scoped_lock_read 클래스도 포함됩니다. 이 클래스는 제공된 reader_writer_lock 개체에 대한 읽기 액세스를 관리합니다.

범위가 지정된 잠금은 작업할 때와 reader_writer_lock 개체를 수동으로 사용할 critical_section 때 몇 가지 이점을 제공합니다. 일반적으로 스택에 범위가 지정된 잠금을 할당합니다. 범위가 지정된 잠금은 제거될 때 자동으로 상호 제외 개체에 대한 액세스를 해제합니다. 따라서 기본 개체의 잠금을 수동으로 해제하지 않습니다. 함수에 여러 return 문이 포함된 경우에 유용합니다. 범위가 지정된 잠금은 예외로부터 안전한 코드를 작성하는 데도 도움이 될 수 있습니다. 문으로 throw 인해 스택이 해제되면 활성 범위 잠금에 대한 소멸자가 호출되므로 상호 제외 개체가 항상 올바르게 해제됩니다.

참고 항목

reader_writer_lock::scoped_lockreader_writer_lock::scoped_lock_read 클래스를 critical_section::scoped_lock사용하는 경우 기본 상호 제외 개체에 대한 액세스를 수동으로 해제하지 마세요. 이렇게 하면 런타임이 잘못된 상태가 될 수 있습니다.

이벤트

concurrency::event 클래스는 상태를 신호 또는 비신호화할 수 있는 동기화 개체를 나타냅니다. 공유 데이터에 대한 액세스를 보호하는 중요한 섹션과 같은 동기화 개체와 달리 이벤트는 실행 흐름을 동기화합니다.

event 클래스는 한 작업이 다른 작업에 대한 작업을 완료한 경우에 유용합니다. 예를 들어 한 태스크는 네트워크 연결 또는 파일에서 데이터를 읽었음을 다른 작업에 알릴 수 있습니다.

메서드 및 기능

다음 표에서는 클래스에서 정의한 몇 가지 중요한 메서드를 보여 줍니다 event .

메서드 설명
wait 이벤트가 신호를 받기를 기다립니다.
set 이벤트를 신호 상태로 설정합니다.
reset 이벤트를 신호가 없는 상태로 설정합니다.
wait_for_multiple 여러 이벤트가 신호를 받기를 기다립니다.

예시

클래스를 사용하는 event 방법을 보여 주는 예제는 동기화 데이터 구조와 Windows API 비교를 참조하세요.

[맨 위로 이동]

동기화 데이터 구조와 Windows API의 비교
동기화 데이터 구조의 동작을 Windows API에서 제공하는 동작과 비교합니다.

동시성 런타임
병렬 프로그래밍을 간소화하는 동시성 런타임에 대해 설명하고 관련 항목의 링크를 제공합니다.