c++ mutex 예제

Posted by adminfeira - 2 agosto, 2019 - Sin categoría - No Comments

뮤텍스는 다른 문제를 해결하는 데 사용될 수 있지만, 뮤텍스가 존재하는 주된 이유는 상호 배제를 제공하여 경주 조건으로 알려진 것을 해결하는 것입니다. 두 개 이상의 스레드 또는 프로세스가 동일한 변수에 동시에 액세스하려고 하면 경합 조건이 발생할 가능성이 있습니다. 다음 코드를 고려 뮤텍스를 큐로 간주합니다. 뮤텍스를 획득하려고 시도하는 모든 스레드는 큐의 끝에 배치됩니다. 스레드가 뮤텍스를 해제하면 큐의 다음 스레드가 해제되어 현재 실행 중입니다. 뮤텍스는 정말 단지 단순화 된 세마포입니다. 당신이 그들에 대해 읽고 그들을 이해한다면, 당신은 뮤텍스를 이해합니다. SO에서 뮤텍스 와 세마포에 관한 몇 가지 질문이 있습니다. 이진 세마포와 뮤텍스의 차이, 언제 뮤텍스를 사용해야 하고 언제 세마포를 사용해야 하는지 등등. 첫 번째 링크의 화장실 예제는 생각할 수 있는 좋은 예입니다. 모든 코드는 키를 사용할 수 있는지 확인하고 키가 있는 경우 예약합니다. 화장실 자체는 예약하지 않지만 열쇠는 예약하지 않습니다.

mutex는 독점적인 비 재귀 소유권 의미 체계를 제공합니다 : [뮤텍스를 갖는 개념은 실제 독점 액세스를 고려할 때 약간 터무니없지만 프로그래밍 세계에서는 스레드가 이미 있음을 다른 스레드가 `볼`수 있도록하는 다른 방법이 없었던 것 같아요. 일부 코드 줄을 실행합니다. 재귀 뮤텍스 등의 개념이 있지만 이 예제는 기본 개념을 보여주기 위한 것일 뿐입니다. 이 예제를 통해 개념에 대한 명확한 그림을 볼 수 있기를 바랍니다.] 실제 물리적 개체에 대한 독점적 인 액세스를 추구하는 인간을 고려할 때 뮤텍스를 갖는 개념은 약간 이상한 것처럼 보이지만 프로그래밍 할 때 우리는 의도적이어야합니다. 동시 스레드와 프로세스에는 우리가 하는 사회적, 문화적 육성이 없으므로 데이터를 잘 공유하도록 강요해야 합니다. 출력에서 볼 수 있듯이 두 스레드는 ramdom 방식으로 cout 리소스를 가져옵니다. 결정적인 액세스를 위해 아래 코드는 뮤텍스를 사용하고 있습니다: cout에 액세스하기 전에 잠금을 한 다음 사용 후 잠금을 해제합니다: 이 클래스는 잠금을 위한 간단한 스마트 관리자입니다. std::lock_guard가 만들어지면 뮤텍스에서 lock()을 자동으로 호출합니다. 가드가 파괴되면 잠금장치도 해제됩니다. 다음과 같이 사용할 수 있습니다 : 아래의 몇 가지 코드를 붙여 넣습니다 (뮤텍스가있는 첫 번째 단계 – HANDLE, SetEvent, WaitForMultipleObjects 등으로 win32에서 동시성을 배웠습니다). 뮤텍스는 초기화되고 다음 두 함수를 호출하여 잠금이 달성됩니다: 첫 번째 함수는 뮤텍스를 초기화하고 두 번째 함수를 통해 코드의 모든 중요한 영역을 잠글 수 있습니다. 이 블로그 게시물에서 우리는이 문제를 해결하기 위해 세마포를 사용하는 방법을 배우게됩니다.

사실, 우리는 mutexes라는 세마포의 특별한 종류를 것입니다. 뮤텍스는 매우 간단한 개체입니다. 하나의 스레드만 동시에 뮤텍스에서 잠금을 가져올 수 있습니다. 뮤텍스의 이 간단하고 강력한 속성은 동기화 문제를 해결하는 데 사용할 수 있습니다. 기술적으로 말하자면, 우리는 우리를 돕기 위해 몇 가지 하드웨어 지원이 필요합니다. 하드웨어 디자이너는 우리에게 하나 이상의 일을하지만 원자로 guranteed되는 기계 지침을 제공합니다. 이러한 명령의 대표적인 예는 TAS(테스트 및 집합)입니다. 리소스에 대한 잠금을 획득하려고 할 때 TAS를 사용하여 메모리의 값이 0인지 확인할 수 있습니다. 만약 그렇다면, 그것은 자원이 사용 중이라는 우리의 신호일 것이고 우리는 아무것도하지 않습니다 (또는 더 정확하게, 우리는 어떤 메커니즘에 의해 기다립니다.

pthreads 뮤텍스는 운영 체제의 특수 큐에 우리를 넣고 리소스를 사용할 수 있게 되면 알려줍니다. 덤버 시스템은 우리가 조건을 반복해서 테스트, 꽉 스핀 루프를 수행해야 할 수 있습니다. 메모리 값이 0이 아닌 경우 TAS는 다른 명령을 사용하지 않고 위치를 0이 아닌 다른 값으로 설정합니다. 그것은 우리에게 원자성을 제공하기 위해 두 개의 어셈블리 지침을 1로 결합하는 것과 같습니다.