동기화 데이터 구조Synchronization Data Structures

동시성 런타임는 여러 스레드의 공유 데이터에 대 한 액세스를 동기화 할 수 있는 여러 데이터 구조를 제공 합니다.The Concurrency Runtime provides several data structures that let you synchronize access to shared data from multiple threads. 이러한 데이터 구조는 자주 수정 하는 공유 데이터를 포함 하는 경우에 유용 합니다.These data structures are useful when you have shared data that you modify infrequently. 예를 들어 중요 한 섹션과 같은 동기화 개체는 공유 리소스를 사용할 수 있을 때까지 다른 스레드가 대기 하도록 합니다.A synchronization object, for example, a critical section, causes other threads to wait until the shared resource is available. 따라서 이러한 개체를 사용 하 여 자주 사용 되는 데이터에 대 한 액세스를 동기화 하는 경우 응용 프로그램의 확장성이 손실 될 수 있습니다.Therefore, if you use such an object to synchronize access to data that is used frequently, you can lose scalability in your application. PPL (병렬 패턴 라이브러리)동시성:: 결합할 수 있는 클래스를 제공 합니다 .이 클래스를 사용 하면 동기화 하지 않고도 여러 스레드나 작업 간에 리소스를 공유할 수 있습니다.The Parallel Patterns Library (PPL) provides the concurrency::combinable class, which enables you to share a resource among several threads or tasks without the need for synchronization. 클래스에 대 한 자세한 내용은 combinable 병렬 컨테이너 및 개체를 참조 하세요.For more information about the combinable class, see Parallel Containers and Objects.

섹션이Sections

이 항목에서는 다음과 같은 비동기 메시지 블록 형식에 대해 자세히 설명 합니다.This topic describes the following asynchronous message block types in detail:

critical_sectioncritical_section

Concurrency:: critical_section 클래스는 다른 작업을 선점 하는 대신 다른 작업에 양보 하는 협조적 상호 제외 개체를 나타냅니다.The concurrency::critical_section class represents a cooperative mutual exclusion object that yields to other tasks instead of preempting them. 중요 섹션은 여러 스레드에서 공유 데이터에 대 한 단독 읽기 및 쓰기 액세스를 필요로 하는 경우에 유용 합니다.Critical sections are useful when multiple threads require exclusive read and write access to shared data.

critical_section클래스가 재진입이 아닌 경우The critical_section class is non-reentrant. Concurrency:: critical_section:: lock 메서드는 이미 잠금을 소유 하 고 있는 스레드에서 호출 하는 경우 concurrency:: improper_lock 형식의 예외를 throw 합니다.The concurrency::critical_section::lock method throws an exception of type concurrency::improper_lock if it is called by the thread that already owns the lock.

메서드 및 기능Methods and Features

다음 표에서는 클래스에 의해 정의 되는 중요 한 메서드를 보여 줍니다 critical_section .The following table shows the important methods that are defined by the critical_section class.

메서드Method 설명Description
locklock 임계 영역을 가져옵니다.Acquires the critical section. 호출 컨텍스트는 잠금을 획득할 때까지 차단 됩니다.The calling context blocks until it acquires the lock.
try_locktry_lock 임계 영역을 가져오려고 시도 하지만 차단 하지는 않습니다.Tries to acquire the critical section, but does not block.
잠금을unlock 임계 영역을 해제 합니다.Releases the critical section.

[맨 위로이동][Top]

reader_writer_lockreader_writer_lock

Concurrency:: reader_writer_lock 클래스는 공유 데이터에 대 한 스레드로부터 안전한 읽기/쓰기 작업을 제공 합니다.The concurrency::reader_writer_lock class provides thread-safe read/write operations to shared data. 여러 스레드가 공유 리소스에 대 한 동시 읽기 액세스를 요구 하지만 해당 공유 리소스에 거의 쓰지 않는 경우 판독기/작성기 잠금을 사용 합니다.Use reader/writer locks when multiple threads require concurrent read access to a shared resource but rarely write to that shared resource. 이 클래스는 한 번에 하나의 스레드만 개체에 대 한 쓰기 권한을 제공 합니다.This class gives only one thread write access to an object at any time.

reader_writer_lock critical_section critical_section 개체에서 공유 리소스에 대 한 단독 액세스 권한을 획득 하 여 동시 읽기 액세스를 방지 하기 때문에 클래스는 클래스 보다 더 나은 성능을 얻을 수 있습니다.The reader_writer_lock class can perform better than the critical_section class because a critical_section object acquires exclusive access to a shared resource, which prevents concurrent read access.

클래스와 마찬가지로 critical_section 클래스는 reader_writer_lock 다른 작업을 선점 하는 대신 다른 작업에 양보 하는 협조적 상호 제외 개체를 나타냅니다.Like the critical_section class, the reader_writer_lock class represents a cooperative mutual exclusion object that yields to other tasks instead of preempting them.

공유 리소스에 써야 하는 스레드가 판독기/작성기 잠금을 획득 하는 경우에도 해당 리소스에 액세스 해야 하는 다른 스레드는 작성기가 잠금을 해제할 때까지 차단 됩니다.When a thread that must write to a shared resource acquires a reader/writer lock, other threads that also must access the resource are blocked until the writer releases the lock. reader_writer_lock클래스는 대기 판독기를 차단 해제 하기 전에 대기 중인 기록기의 차단을 해제 하는 잠금입니다 쓰기 기본 설정 잠금의 예입니다.The reader_writer_lock class is an example of a write-preference lock, which is a lock that unblocks waiting writers before it unblocks waiting readers.

클래스와 마찬가지로 critical_section 클래스는 reader_writer_lock 재진입 성이 아닙니다.Like the critical_section class, the reader_writer_lock class is non-reentrant. Concurrency:: reader_writer_lock:: lockconcurrency:: reader_writer_lock:: lock_read 메서드는 improper_lock 이미 잠금을 소유한 스레드에 의해 호출 될 경우 형식의 예외를 throw 합니다.The concurrency::reader_writer_lock::lock and concurrency::reader_writer_lock::lock_read methods throw an exception of type improper_lock if they are called by a thread that already owns the lock.

참고

reader_writer_lock클래스가 재진입이 아닌 경우 읽기 전용 잠금을 판독기/writer 잠금으로 업그레이드 하거나 읽기 전용 잠금으로 판독기/writer 잠금을 다운 그레이드할 수 없습니다.Because the reader_writer_lock class is non-reentrant, you cannot upgrade a read-only lock to a reader/writer lock or downgrade a reader/writer lock to a read-only lock. 이러한 작업 중 하나를 수행 하면 지정 되지 않은 동작이 생성 됩니다.Performing either of these operations produces unspecified behavior.

메서드 및 기능Methods and Features

다음 표에서는 클래스에 의해 정의 되는 중요 한 메서드를 보여 줍니다 reader_writer_lock .The following table shows the important methods that are defined by the reader_writer_lock class.

메서드Method 설명Description
locklock 잠금에 대 한 읽기/쓰기 액세스 권한을 얻습니다.Acquires read/write access to the lock.
try_locktry_lock 잠금에 대 한 읽기/쓰기 액세스를 얻으려고 시도 하지만 차단 하지는 않습니다.Tries to acquire read/write access to the lock, but does not block.
lock_readlock_read 잠금에 대 한 읽기 전용 액세스를 가져옵니다.Acquires read-only access to the lock.
try_lock_readtry_lock_read 잠금에 대 한 읽기 전용 액세스를 얻으려고 시도 하지만 차단 하지는 않습니다.Tries to acquire read-only access to the lock, but does not block.
잠금을unlock 잠금을 해제합니다.Releases the lock.

[맨 위로이동][Top]

scoped_lock 및 scoped_lock_readscoped_lock and scoped_lock_read

critical_sectionreader_writer_lock 클래스는 상호 제외 개체를 사용 하는 방법을 간소화 하는 중첩 된 도우미 클래스를 제공 합니다.The critical_section and reader_writer_lock classes provide nested helper classes that simplify the way you work with mutual exclusion objects. 이러한 도우미 클래스를 범위 지정 잠금 이라고 합니다.These helper classes are known as scoped locks.

critical_section클래스에는 concurrency:: critical_section:: scoped_lock 클래스가 포함 되어 있습니다.The critical_section class contains the concurrency::critical_section::scoped_lock class. 생성자는 제공 된 개체에 대 한 액세스 권한을 획득 합니다. critical_section 소멸자는 해당 개체에 대 한 액세스 권한을 해제 합니다.The constructor acquires access to the provided critical_section object; the destructor releases access to that object. 클래스에는 reader_writer_lock 제공 된 개체에 대 한 쓰기 액세스를 관리 한다는 점을 제외 하 고와 유사한 concurrency:: reader_writer_lock:: scoped_lock 클래스가 포함 되어 있습니다 critical_section::scoped_lock reader_writer_lock .The reader_writer_lock class contains the concurrency::reader_writer_lock::scoped_lock class, which resembles critical_section::scoped_lock, except that it manages write access to the provided reader_writer_lock object. 클래스에는 reader_writer_lock concurrency:: reader_writer_lock:: scoped_lock_read 클래스도 포함 되어 있습니다.The reader_writer_lock class also contains the concurrency::reader_writer_lock::scoped_lock_read class. 이 클래스는 제공 된 개체에 대 한 읽기 액세스를 관리 reader_writer_lock 합니다.This class manages read access to the provided reader_writer_lock object.

범위가 지정 된 잠금은 및 개체를 수동으로 작업할 때 몇 가지 이점을 제공 critical_section reader_writer_lock 합니다.Scoped locks provide several benefits when you are working with critical_section and reader_writer_lock objects manually. 일반적으로 스택에 범위가 지정 된 잠금을 할당 합니다.Typically, you allocate a scoped lock on the stack. 범위가 지정 된 잠금은 상호 제외 개체가 제거 될 때 자동으로 액세스를 해제 합니다. 따라서 기본 개체를 수동으로 잠금 해제 하지 않습니다.A scoped lock releases access to its mutual exclusion object automatically when it is destroyed; therefore, you do not manually unlock the underlying object. 이는 함수에 문이 여러 개 포함 된 경우에 유용 return 합니다.This is useful when a function contains multiple return statements. 범위가 지정 된 잠금은 예외 안전 코드를 작성 하는 데 도움이 될 수도 있습니다.Scoped locks can also help you write exception-safe code. throw 문이 스택을 해제 하면 활성 범위 잠금의 소멸자가 호출 되므로 상호 제외 개체가 항상 올바르게 해제 됩니다.When a throw statement causes the stack to unwind, the destructor for any active scoped lock is called, and therefore the mutual exclusion object is always correctly released.

참고

, 및 클래스를 사용 하는 경우 critical_section::scoped_lock reader_writer_lock::scoped_lock reader_writer_lock::scoped_lock_read 기본 상호 제외 개체에 대 한 액세스를 수동으로 해제 하지 마십시오.When you use the critical_section::scoped_lock, reader_writer_lock::scoped_lock, and reader_writer_lock::scoped_lock_read classes, do not manually release access to the underlying mutual exclusion object. 이렇게 하면 런타임이 잘못 된 상태가 될 수 있습니다.This can put the runtime in an invalid state.

이벤트event

Concurrency:: event 클래스는 상태가 신호를 받거나 신호를 받을 수 없는 동기화 개체를 나타냅니다.The concurrency::event class represents a synchronization object whose state can be signaled or non-signaled. 공유 데이터에 대 한 액세스를 보호 하기 위해 중요 한 섹션과 같은 동기화 개체와 달리 이벤트는 실행 흐름을 동기화 합니다.Unlike synchronization objects, such as critical sections, whose purpose is to protect access to shared data, events synchronize flow of execution.

event클래스는 한 작업이 다른 작업에 대해 작업을 완료 한 경우에 유용 합니다.The event class is useful when one task has completed work for another task. 예를 들어 한 작업은 네트워크 연결 또는 파일에서 데이터를 읽기 위해 다른 작업에 신호를 보낼 수 있습니다.For example, one task might signal another task that it has read data from a network connection or from a file.

메서드 및 기능Methods and Features

다음 표에서는 클래스에 정의 된 몇 가지 중요 한 메서드를 보여 줍니다 event .The following table shows several of the important methods that are defined by the event class.

메서드Method 설명Description
대기한wait 이벤트가 신호를 받을 때까지 기다립니다.Waits for the event to become signaled.
setset 이벤트를 신호 받음 상태로 설정 합니다.Sets the event to the signaled state.
resetreset 이벤트를 신호를 받지 않는 상태로 설정 합니다.Sets the event to the non-signaled state.
wait_for_multiplewait_for_multiple 여러 이벤트가 신호를 받을 때까지 대기 합니다.Waits for multiple events to become signaled.

예제Example

클래스를 사용 하는 방법을 보여 주는 예제는 event 동기화 데이터 구조와 Windows API의 비교를 참조 하세요.For an example that shows how to use the event class, see Comparing Synchronization Data Structures to the Windows API.

[맨 위로이동][Top]

동기화 데이터 구조와 Windows API의 비교Comparing Synchronization Data Structures to the Windows API
동기화 데이터 구조와 Windows API에서 제공 하는 동작을 비교 합니다.Compares the behavior of the synchronization data structures to those provided by the Windows API.

동시성 런타임Concurrency Runtime
병렬 프로그래밍을 간소화하는 동시성 런타임에 대해 설명하고 관련 항목의 링크를 제공합니다.Describes the Concurrency Runtime, which simplifies parallel programming, and contains links to related topics.