sem_trywait 예제

실시예 4-14의 데이터 구조는 조건 변수 예제에 사용되는 것과 유사합니다(예제 4-11 참조). 두 개의 세마포어는 전체 버퍼와 빈 버퍼의 수를 나타내며 생산자가 빈 버퍼가 있을 때까지 기다려야 하고 소비자가 전체 버퍼가 있을 때까지 기다려야 합니다. sem_wait, sem_timewait, sem_trywait – 세마포를 잠급니다 sem_trywait() 함수는 해당 세마포어가 현재 잠겨 있지 않은 경우에만 지정된 세마포를 잠급니다. 즉, 세마포 값이 현재 양수인 경우입니다. 그렇지 않으면 세마포를 잠그지 않습니다. sem_wait() 함수는 해당 세마포에서 세마포 잠금 작업을 수행하여 sem에서 참조하는 세마포를 잠급니다. 세마포 값이 현재 0이면 호출 스레드는 세마포를 잠그거나 신호에 의해 호출이 중단될 때까지 sem_wait()에 대한 호출에서 반환되지 않습니다. sem_trywait() 함수는 세마포가 현재 잠겨 있지 않은 경우에만 sem에서 참조하는 세마포를 잠급니다. 즉, 세마포 값이 현재 양수인 경우입니다.

그렇지 않으면 세마포를 잠그지 않습니다. 호출 프로세스가 sem에 의해 지정된 세마포에 세마포 잠금 작업을 성공적으로 수행한 경우 sem_trywait() 및 sem_wait() 함수는 0을 반환합니다. 호출에 실패한 경우 세마포의 상태는 변경되지 않으며 함수는 -1 값을 반환하고 오류를 나타내기 위해 errno를 설정해야 합니다. sem_trywait() 및 sem_wait() 함수는 세마포가 이미 잠겨 있는 경우 실패하므로 sem_trywait() 작업(sem_trywait()만)으로 즉시 잠글 수 없습니다. 또 다른 (바이너리) 세마포어 쌍은 뮤텍스와 동일한 역할을 하며, 여러 생산자와 여러 개의 빈 버퍼 슬롯이 있을 때, 그리고 여러 소비자와 여러 개의 전체 버퍼 슬롯이 있을 때 버퍼에 대한 액세스를 제어합니다. 뮤텍스는 여기서 더 잘 작동하지만 세마포 사용의 좋은 예를 제공하지는 않습니다. sem_trywait(3RT)를 사용하여 카운트가 0보다 큰 경우 sem으로 가리키는 세마포의 개수를 원자적으로 감소시키려고 합니다. 이 함수는 sem_wait()의 비차단 버전입니다. 즉, 실패하면 즉시 반환됩니다.

sem_trywait()는 sem_wait()와 동일하지만, 감소가 즉시 수행될 수 없는 경우 를 제외하고, 호출은 차단 대신 오류(errno set)를 반환합니다. 교착 상태가 검색되었습니다. 즉, 두 개의 별도 프로세스가 다른 프로세스에 의해 “보유”된 세마포를 통해 사용 가능한 리소스가 릴리스되기를 기다리고 있습니다. 실시간 응용 프로그램은 세마포를 사용할 때 우선 순위 반전이 발생할 수 있습니다. 우선 순위가 높은 스레드 “locks”(즉, 대기 중)가 우선 순위가 낮은 스레드에 의해 “잠금 해제”(즉, 게시됨)가 될 예정이지만 우선 순위가 낮은 스레드는 중간 우선 순위 스레드에 의해 선점될 때 문제가 발생합니다. 이 시나리오는 우선 순위 반전으로 이어집니다. 우선 순위가 높은 스레드는 무제한 기간 동안 우선 순위가 낮은 스레드에 의해 차단됩니다. 시스템 설계 중에 실시간 프로그래머는 이러한 종류의 우선 순위 반전 가능성을 고려해야 합니다.