mutex semaphore 예제

세마포는 프로세스 동기화를 위해 대기 및 신호인 두 개의 원자성 작업을 사용합니다. 예를 들어, 뮤텍스를 사용하는 방법은 다음과 같습니다: 7. 인터럽트 서비스 루틴에서 뮤텍스/세마포를 획득할 수 있습니까? Java 다중 스레드 예제에서는 Semaphore 및 Mutex를 사용하여 리소스에 액세스하는 스레드 수를 제한하는 방법을 보여 주습니다. 이진 세마포와 뮤텍스 사이에는 모호함이 있습니다. 뮤텍스가 이진 세마포라는 것을 우연히 접했을 수도 있습니다. 그러나 그들은하지 않습니다! 뮤텍스와 세마포의 목적은 다릅니다. 구현에서 유사성으로 인해 뮤텍스는 이진 세마포라고 할 수 있습니다. 세마포 를 계산 사용! 카운트 세마포를 사용하여 남은 공백 수와 스택의 항목 수를 추적하기 위해 다른 세마포를 추적합니다. 우리는이 두 세마포를 `sremain`와 `sitems`라고 부를 것입니다. 세마포의 수가 0으로 감소된 경우 sem_wait가 기다립니다(sem_post를 호출하는 다른 스레드에 의해). 언제든지 하나의 스레드만 전체 버퍼에서 작업할 수 있습니다. 개념은 세마포를 사용하여 일반화 될 수있다. 아니요.

신호 대 잠금 메커니즘을 설명하기 때문에 별도로 치료하는 것이 좋습니다. 그러나 이진 세마포는 뮤텍스와 관련된 동일한 중요한 문제(예: 우선 순위 반전)를 경험할 수 있습니다. 우리는 이후 기사에서 이들을 다룰 것입니다. 엄밀히 말하면 뮤텍스는 리소스에 대한 액세스를 동기화하는 데 사용되는 잠금 메커니즘입니다. 하나의 작업(OS 추상화를 기반으로 하는 스레드 또는 프로세스일 수 있음)만 뮤텍스를 획득할 수 있습니다. 즉, 뮤텍스와 관련된 소유권이 있으며 소유자만 잠금(뮤텍스)을 해제할 수 있습니다. 한편 프로세스는 다른 스레드/프로세스가 해당 리소스에 액세스할 수 없는 mutex 개체에 대한 잠금을 획득했습니다. 뮤텍스 개체가 이미 잠겨 있는 경우 뮤텍스 개체에 대한 잠금을 획득하려는 프로세스는 기다려야 하며 뮤텍스 개체가 잠금 해제될 때까지 시스템에서 대기됩니다. 이진 세마포는 세마포를 세는 것과 같지만 그 값은 0과 1로 제한됩니다. 대기 작업은 세마포가 1이고 세마포가 0일 때 신호 작업이 성공한 경우에만 작동합니다. std::재귀_뮤텍스 및 std::재귀_timed_mutex는 재귀 뮤텍스이므로 단일 스레드에서 여러 개의 잠금을 보유할 수 있습니다. ISR은 현재 실행 중인 스레드의 컨텍스트에서 비동기적으로 실행됩니다.

ISR에서 동기화 프리미티브의 가용성을 쿼리(차단 호출)하지 않는 것이 좋습니다. ISR은 짧은 의미, 뮤텍스/세마포에 대 한 호출 현재 실행 중인 스레드를 차단할 수 있습니다. 그러나 ISR은 세마포를 신호하거나 뮤텍스의 잠금을 해제할 수 있습니다. 1. 진실은, 운영 체제에 많은 “교과서”용어 mutex (또는 실시간)를 정의하지 못합니다. 그러나 트롤텍의 Qt 임베디드 4.4 참조 문서의 QSemaphore 페이지에서 일반적인 스니펫을 고려하십시오: “세마포는 뮤텍스의 일반화입니다. 뮤텍스는 한 번만 잠글 수 있지만 세마포를 여러 번 획득할 수 있습니다. 세마포는 일반적으로 특정 수의 동일한 리소스를 보호하는 데 사용됩니다.” 그런 다음 Qt 설명서는 적절한 구현을 위해 중요한 세부 정보(예: 두 번째 유형의 RTOS 기본 값필요)가 부족한 이론적 문제에 대한 솔루션을 정교하게(길이 및 코드 스니펫)으로 진행합니다. 【백】 이러한 뮤텍스는 일반적으로 거의 업데이트되지 않는 공유 데이터를 보호하는 데 사용되지만 스레드가 읽는 경우 안전하게 업데이트할 수 없습니다. 따라서 읽기 스레드는 데이터를 읽는 동안 공유 소유권을 차지합니다. 데이터를 수정해야 하는 경우 수정 스레드는 먼저 뮤텍스의 단독 소유권을 가지므로 다른 스레드가 이를 읽지 않도록 한 다음 수정이 완료된 후 단독 잠금을 해제합니다.