c 언어 세마포어 예제

코드의 근본적인 문제는 두 개의 API를 혼합한다는 것입니다. 불행히도 온라인 리소스는 이 점을 지적하는 데 는 좋지 않지만 UNIX와 같은 시스템에는 두 개의 세마포 API가 있습니다. 이 형식은 구조체처럼 작동하므로 변수에 할당하면 내용의 복사본을 만듭니다. 세마포를 복사하는 것은 거의 확실히 나쁜 생각입니다. POSIX에서 복사본의 동작은 정의되지 않습니다. 맨 페이지에서 세마포 API를 연구하고 이 예제를 루십시오. POSIX 표준은 세마포에 대한 인터페이스를 지정합니다. Pthread의 일부가 아니지만 Pthread를 구현하는 대부분의 UNIX는 세마포를 제공합니다. 세마포를 뮤텍스로 사용하면 일반적으로 뮤텍스가 잠금 해제되었음을 나타내기 위해 세마포를 1로 초기화합니다. 즉, 하나의 스레드가 차단없이 세마포를 통과 할 수 있습니다. 활동 2. 프로그램이 항상 예상 출력(값 2*NITER)을 생성하도록 프로그램 badcnt.c를 수정하는 가이드로 위의 예제를 사용합니다.

코드를 수정하기 전에 badcnt.c의 복사본을 goodcnt.c로 만듭니다. 스레드는 우아하고 효율적인 프로그램 작성을 크게 단순화할 수 있습니다. 그러나 이전 예제의 변수 cnt와 같이 여러 스레드가 공통 주소 공간을 공유하는 경우 문제가 있습니다. 이 섹션에서는 유닉스 시스템 V. 뮤텍스에서 유래했기 때문에 호출되는 System V IPC 세마포에 대해 설명하며, 가치 및 절전 모드 해제에 대한 단독 액세스를 제공합니다. cond는 세마포에서 기다리는 경우 조건 변수 스레드가 대기하는 조건 변수 스레드입니다. 이 장의 코드는 이 책의 리포지토리에 있는 디렉터리 세마포에 있습니다(섹션 0.1 참조). 다시 말하지만 스레드는 값을 증가시키기 전에 뮤텍스를 잠그야 합니다. 세마포가 음수이면 스레드가 대기 중임을 의미하므로 신호 스레드는 웨이크업을 증가시키고 조건 변수를 신호합니다. 세마포는 스레드가 서로 간섭하지 않고 함께 작업하는 데 사용되는 데이터 구조입니다. 모든 POSIX 세마포 함수 및 유형은 semaphore.h에서 프로토타입또는 정의됩니다. 세마포 개체를 정의하려면 sem_t sem_name을 사용합니다.

sem_wait()를 사용하여 잠그거나 기다릴 수 있습니다. 그리고 sem_post()를 해제하여 잠금을 해제합니다. 세마포는 IPC(프로세스 간 통신)에 대해 sem_init() 또는 sem_open()을 초기화합니다. 3) 세마포를 초기화하지 않고 sem_wait() 및 sem_post()로 전달합니다. 사용 하기 전에 1 (경우에) 1로 초기화 해야 합니다., 또는 교착 상태가 있을 것 이다. queue_push는 더 이상 queue_full을 호출할 필요가 없습니다. 대신 세마포어는 사용 가능한 공백 수를 추적하고 큐가 가득 차면 생산자를 차단합니다. 세마포는 프로세스 동기화 및 멀티스레딩에 매우 유용합니다. 그러나 예를 들어 C 언어로 말하는 실제 생활에서 하나를 사용하는 방법은 무엇입니까? 세마포 구현(잠금 및 잠금 해제)에 대한 샘플 코드 아래를 확인하십시오. 이러한 세마포 래퍼 함수를 사용하여 섹션 10.2에서 생산자-소비자 문제에 대한 솔루션을 작성할 수 있습니다.

이 섹션의 코드는 queue_sem.c에 있습니다. 2) 함수 sem_wait(), sem_post()는 세마포 변수를 필요로 하지만 세마포어 ID를 전달하는 것은 의미가 없습니다. 세마포로 해결할 수있는 모든 문제는 조건 변수 및 뮤텍스로 해결할 수 있습니다.

Uncategorized