c++ semaphore 예제

이 예제에서는 공유 버퍼 버퍼가 정수의 배열일 뿐이며 채우기 및 사용 정수는 배열에 인덱스로 사용되며 데이터(채우기)와 데이터(use)를 모두 넣을 위치를 추적하는 데 사용된다고 가정합니다. 예를 들어 POSIX pthread_mutex_trylock() API입니다. 뮤텍스를 사용할 수 없는 경우 함수는 즉시 반환되지만 API pthread_mutex_lock()은 리소스를 사용할 수 있을 때까지 스레드를 차단합니다. 세마포가 설정되어 있는 동안 키보드 입력을 기다리고 있습니다. 입력이 있으면 첫 번째 스레드가 키보드 입력을 다시 읽기 전에 두 번째 스레드가 문자를 계산할 수 있도록 세마포어를 해제합니다. 이진 세마포와 뮤텍스 사이에는 모호함이 있습니다. 뮤텍스가 이진 세마포라는 것을 우연히 접했을 수도 있습니다. 그러나 그들은하지 않습니다! 뮤텍스와 세마포의 목적은 다릅니다. 구현에서 유사성으로 인해 뮤텍스는 이진 세마포라고 할 수 있습니다. 아래 코드는 뮤텍스와 액세스를 동기화하는 또 다른 예를 보여줍니다. 액세스를 제어하기 위해 코드 섹션을 입력하기 전에 뮤텍스를 잠근 다음 완료되면 잠금을 해제합니다. 언제든지 하나의 스레드만 전체 버퍼에서 작업할 수 있습니다. 개념은 세마포를 사용하여 일반화 될 수있다.

세마포의 기본 코드는 여기에 제시된 대로 간단합니다. 그러나 함수가 원자성이어야하고 코드를 직접 작성하면 함수완료없이 컨텍스트 전환이 발생하여 혼란이 발생할 수 있기 때문에이 코드를 직접 작성할 수 없습니다. 코드에서 세마포는 5개로 초기화했습니다. sem_init() 호출의 두 번째 매개 변수는 0이며 이렇게 하면 세마포를 스레드에 비공개로 만듭니다. 하나의 값을 전달하면 세마포를 여러 프로세스 간에 공유할 수 있습니다. 아래 예제에서는 0 또는 1이 걸리는 이진 세마포를 사용합니다. 세마포의 더 일반적인 유형이있다, 값의 넓은 범위를 소요 계산 세마포. 세마포어는 지정된 시간에 하나의 스레드만 실행할 수 있도록 코드 섹션을 보호하는 데 사용됩니다.

이러한 종류의 작업을 수행하려면 이진 세마포가 필요합니다. 그러나 제한된 수의 스레드가 코드 조각을 실행하도록 허용하려면 세마포를 계산해야 할 수 있습니다. main (main)에서 새 스레드를 만든 후 텍스트로 읽고 전역인 my_string에 넣고 sem_post()로 세마포를 증가시킴) 이 함수는 세마포를 완료하면 세마포를 정리합니다.