뮤텍스가 스레드 동기화에 사용되는 방법을 보여 줄 예제예이지만 뮤텍스는 C++에서 가장 널리 사용되는 데이터 보호 메커니즘일 수 있지만 올바른 데이터를 보호하고 인터페이스에 내재된 경합 조건을 피하기 위해 코드를 구성하는 것이 중요합니다. 뮤텍스는 교착 상태의 형태로 너무 많거나 너무 적은 데이터를 보호하는 자체 문제와 함께 제공됩니다. 요컨대, 당신은 가장 간단한 가능한 뮤텍스 예제 프로그램과 그것이 작동하는 방법의 논리에 대한 가장 간단한 가능한 설명을 도와 주시겠습니까? 나는 이것이 다른 초보자를 많이 도움이 될 것이라고 확신합니다. 얼마 전에 사용한 예제를 살펴보겠습니다. 이 겉보기에 무고한 짧은 코드는 이미 리소스에 대한 경합 조건의 문제가 있습니다.: 이 예제에서는 두 개의 스레드(jobs)가 만들어지고 이러한 스레드의 시작 함수에서 시작된 작업 번호와 작업 번호에 대한 로그를 얻기 위해 카운터가 유지됩니다. 완료됩니다. 스레드 동기화 문제 동기화 문제를 연구하는 예제 코드 : 따라서 이번에는 두 작업의 시작 및 완료 로그가 있습니다. 그래서 스레드 동기화는 Mutex를 사용하여 일어났습니다. [뮤텍스를 갖는 개념은 실제 독점 액세스를 고려할 때 약간 터무니없지만 프로그래밍 세계에서는 스레드가 이미 일부 코드 줄을 실행하고 있음을 다른 스레드가 `볼`수 있도록하는 다른 방법은 없다고 생각합니다. 재귀 뮤텍스 등의 개념이 있지만 이 예제는 기본 개념을 보여주기 위한 것일 뿐입니다.
이 예제를 통해 개념에 대한 명확한 그림을 볼 수 있기를 바랍니다.] 예를 들어 간단한 카운터 구조를 수행합니다. 이 구조에는 값을 증분하거나 감소하는 값과 메서드가 있습니다. 다음은 구조입니다: 특정 구현보다는 API에 대해 작성된 것을 좋아하며 동기화를 이해하는 데 도움이되는 몇 가지 간단한 예제를 제공합니다. 기술적으로 말하자면, 우리는 우리를 돕기 위해 몇 가지 하드웨어 지원이 필요합니다. 하드웨어 디자이너는 우리에게 하나 이상의 일을하지만 원자로 guranteed되는 기계 지침을 제공합니다. 이러한 명령의 대표적인 예는 TAS(테스트 및 집합)입니다. 리소스에 대한 잠금을 획득하려고 할 때 TAS를 사용하여 메모리의 값이 0인지 확인할 수 있습니다. 만약 그렇다면, 그것은 자원이 사용 중이라는 우리의 신호일 것이고 우리는 아무것도하지 않습니다 (또는 더 정확하게, 우리는 어떤 메커니즘에 의해 기다립니다. pthreads 뮤텍스는 운영 체제의 특수 큐에 우리를 넣고 리소스를 사용할 수 있게 되면 알려줍니다. 덤버 시스템은 우리가 조건을 반복해서 테스트, 꽉 스핀 루프를 수행해야 할 수 있습니다. 메모리 값이 0이 아닌 경우 TAS는 다른 명령을 사용하지 않고 위치를 0이 아닌 다른 값으로 설정합니다. 그것은 우리에게 원자성을 제공하기 위해 두 개의 어셈블리 지침을 1로 결합하는 것과 같습니다.
따라서 값이 시작된 후에는 값을 테스트하고 변경할 수 없습니다( 변경이 적절한 경우).