pthread semaphore 예제

세마포로 해결할 수있는 모든 문제는 조건 변수 및 뮤텍스로 해결할 수 있습니다. 이것이 사실임을 증명하는 한 가지 방법은 조건 변수 및 뮤텍스를 사용하여 세마포를 구현하는 것입니다. 세마포를 잠그거나 기다릴 수 있습니다 sem_wait 함수를 사용할 수 있습니다: 이 장의 코드는 이 책의 리포지토리에 있는 디렉터리 세마포에 있습니다(섹션 0.1 참조). 그럼에도 불구하고 세마포로 간단하게 해결할 수 있는 몇 가지 동기화 문제가 있어 더 확실하게 올바른 솔루션을 얻을 수 있습니다. 이 장에서는 세마포와 내 코드로 작업하기 위한 C API를 제공합니다. 그리고 그것은 마지막 도전을 제시 : 당신은 뮤텍스 및 조건 변수를 사용하여 세마포의 구현을 작성할 수 있습니까? 이러한 세마포 래퍼 함수를 사용하여 섹션 10.2에서 생산자-소비자 문제에 대한 솔루션을 작성할 수 있습니다. 이 섹션의 코드는 queue_sem.c에 있습니다. 음, 우리는 리눅스 시스템에서 POSIX 세마포 라이브러리가 있습니다. 그것을 사용하는 방법을 알아 봅시다. 뮤텍스는 값과 웨이크업에 대한 독점적 인 액세스를 제공합니다. cond는 세마포에서 기다리는 경우 조건 변수 스레드가 대기하는 조건 변수 스레드입니다. 스레딩 및 프로세스 간 통신은 선택할 수 있는 다양한 구성표를 가지고 있습니다.

여기에 주어진 이러한 타우센의 코드 중 pthread및 세마포를 입증했다. 다음은 POSIX 뮤텍스 및 조건 변수를 사용하여 세마포를 구현하는 것입니다 : 스레드가 세마포에서 기다릴 때 값을 감소시키기 전에 뮤텍스를 잠글 수 있습니다. 세마포의 값이 음수가 되면 스레드는 „절전 모드 해제”를 사용할 수 있을 때까지 차단합니다. 차단되는 동안 뮤텍스가 잠금 해제되므로 다른 스레드가 신호를 표시할 수 있습니다. queue_push는 더 이상 queue_full을 호출할 필요가 없습니다. 대신 세마포어는 사용 가능한 공백 수를 추적하고 큐가 가득 차면 생산자를 차단합니다. 사용하기 전에 이름 없는 세마포를 sem_init(3)을 사용하여 초기화해야 합니다. 그런 다음 sem_post(3) 및 sem_wait(3)를 사용하여 작동할 수 있습니다. 세마포가 더 이상 필요하지 않고 세마포가 있는 메모리가 할당되기 전에 sem_destroy(3)를 사용하여 세마포를 파괴해야 합니다. sem_open(3) 함수는 새 세마포를 만들거나 기존 명명된 세마포를 엽니다. 세마포를 연 후, sem_post(3) 및 sem_wait(3)를 사용하여 조작할 수 있다. 세마포를 사용하여 프로세스가 완료되면 sem_close(3)를 사용하여 세마포를 닫을 수 있습니다.

세마포를 사용하여 모든 프로세스가 완료되면 sem_unlink(3)를 사용하여 시스템에서 제거할 수 있습니다. POSIX 세마포는 sem_t 타입을 가지고 있다. 이 형식은 구조체처럼 작동하므로 변수에 할당하면 내용의 복사본을 만듭니다. 세마포를 복사하는 것은 거의 확실히 나쁜 생각입니다. POSIX에서 복사본의 동작은 정의되지 않습니다.

Bez kategorii