Blog

2 August 2019

멀티스레드 예제 c++

잠금을 사용하면 여러 스레드가 동시에 개체에 액세스하지 않도록 보장하지만 성능이 크게 저하될 수 있습니다. 여러 스레드가 실행되는 프로그램을 상상해 보십시오. 각 스레드가 특정 개체를 사용해야 하고 실행하기 전에 해당 개체에 대한 단독 잠금을 얻기 위해 기다려야 하는 경우 스레드는 모두 실행이 중지되고 서로 뒤로 백업되어 성능이 저하됩니다. 이러한 이유로 단위로 실행해야 하는 코드가 있는 경우에만 잠금을 사용해야 합니다. 예를 들어 상호 종속된 여러 리소스를 업데이트할 수 있습니다. 이러한 코드는 원자성이라고합니다. 잠금을 원자적으로 실행해야 하는 코드로만 제한하면 성능이 양호하면서도 데이터의 안전을 보장하는 다중 스레드 구성 요소를 작성할 수 있습니다. 이것은 mutex를 사용하여 작성된 이 상황의 예입니다: 다음 예제에서는 교착 상태를 피하기 위해 코드가 작성되었지만 두 스레드가 동시에 실행되는 경우 지속적으로 획득하고 해제하는 라이브 록에 갇혀 있습니다. 뮤텍스.

어느 쪽이든 진전을 이룰 가능성은 거의 없습니다. 각 스레드는 잠금을 획득한 다음 다른 잠금을 획득하려고 시도합니다. 다른 잠금을 획득하지 못하면 다른 잠금이 모두 다시 가져오려고 시도하기 전에 보유하고 있는 잠금을 해제합니다. 스레드는 두 잠금을 모두 획득할 때 루프를 종료하고 발생할 수 있지만 그때까지는 응용 프로그램이 진행되지 않습니다: 일반적으로 작업을 완료하려면 두 개 이상의 별개의 조각을 수정해야 하는 경우 문제가 있는 경합 조건이 발생합니다. Invariants 섹션의 예제에서 두 개의 링크 포인터와 같은 데이터의 데이터입니다. 작업은 두 개의 개별 데이터 조각에 액세스해야 하므로 별도의 명령어로 수정해야 하며, 다른 스레드는 데이터 구조중 하나만 완료될 때 데이터 구조에 액세스할 수 있습니다. 세마포는 증분되거나 감소될 수 있는 카운터입니다. 리소스에 대한 한정된 제한이 있고 해당 제한을 적용하기 위한 메커니즘이 필요한 경우에 사용할 수 있습니다.

Bize Ulaşın