Top

c++ mutex 예제

특정 구현이 아닌 API에 대해 작성된 것을 좋아하며 동기화를 이해하는 데 도움이되는 몇 가지 간단한 예제를 제공합니다. 뮤텍스의 절대적으로 직관적이지 않은 구문 중 하나는 pthread_mutex_lock (& mutex1);, 뮤텍스가 잠겨있는 것처럼 보이는 곳, 내가 정말로 잠그고 싶은 것이 다른 변수일 때. 이 구문은 뮤텍스를 잠그면 뮤텍스가 잠금 해제될 때까지 코드 영역을 잠그나요? 그렇다면 스레드는 영역이 잠겨 있음을 어떻게 알 수 있습니까? [업데이트: 스레드는 메모리 펜싱에 의해 영역이 잠겨 있음을 알고 있습니다.]. 그리고 이러한 현상은 중요한 섹션이라고하지 않습니까? [업데이트: 중요 섹션 개체는 개체가 뮤텍스보다 빠르며 이를 구현하는 스레드에서만 볼 수 있는 Windows에서만 사용할 수 있습니다. 그렇지 않으면, 중요 섹션은 뮤텍스에 의해 보호 되는 코드의 영역을 참조] [뮤텍스를 갖는 개념은 실제 독점 액세스를 고려할 때 조금 터무니, 하지만 프로그래밍 세계에서 나는 다른 스레드를 `볼` 다른 방법을 할 수 없었다 같아요 t hread는 이미 일부 코드 줄을 실행하고 있었습니다. 재귀 뮤텍스 등의 개념이 있지만 이 예제는 기본 개념을 보여주기 위한 것일 뿐입니다. 이 예제를 통해 개념에 대한 명확한 그림을 볼 수 있기를 바랍니다.] 아래 섹션에서는 데이터 경합에 대해 설명한 다음 뮤텍스 및 lock_guard()를 사용하여 데이터 경합 조건을 방지하는 방법을 제시합니다. 이 블로그 게시물에서 우리는이 문제를 해결하기 위해 세마포를 사용하는 방법을 배우게됩니다. 사실, 우리는 mutexes라는 세마포의 특별한 종류를 것입니다. 뮤텍스는 매우 간단한 개체입니다. 하나의 스레드만 동시에 뮤텍스에서 잠금을 가져올 수 있습니다. 뮤텍스의 이 간단하고 강력한 속성은 동기화 문제를 해결하는 데 사용할 수 있습니다. 카운터 구조 스레드를 안전하게 만들려면 std::mutex 멤버를 추가한 다음 개체의 모든 함수에서 뮤텍스를 잠그도록 해야 합니다: 목록에 요소를 추가하는 과정에서 0에서 99까지의 모든 정수를 두는 스레드 t1이 다른 thr와 경쟁합니다.

모든 10 요소를 두고 ead t2. 또한 목록을 인쇄하기 위해 동일한 목록에 액세스 한 또 다른 경쟁 스레드 t3가 있습니다. 결과에서 볼 수 있듯이 목록은 순서대로 요소를 추가하지 못했습니다. 이는 세 개의 스레드가 동시에 목록에 액세스했기 때문입니다. 따라서 올바른 목록을 얻으려면 뮤텍스와 같은 보호 메커니즘이 필요합니다.