c++ semaphore 예제

Tempo de leitura: menos de 1 minuto

0 Flares Filament.io 0 Flares ×

세마포는 프로세스 동기화 및 멀티스레딩에 매우 유용합니다. 그러나 예를 들어 C 언어로 말하는 실제 생활에서 하나를 사용하는 방법은 무엇입니까? 다음 예제에서는 세마포 개체를 사용하여 특정 작업을 수행할 수 있는 스레드 수를 제한합니다. 첫째, CreateSemaphore 함수를 사용하여 세마포를 만들고 초기 및 최대 개수를 지정한 다음 CreateThread 함수를 사용하여 스레드를 만듭니다. 세마포의 특별한 경우는 뮤텍스입니다. 뮤텍스는 코드의 중요한 섹션을 잠그거나 잠금 해제하는 데 사용되는 이진 세마포어로, 한 스레드만 지정된 시간에 (문제를 일으키지 않고) 액세스할 수 있습니다. POSIX는 “휴대용 운영 체제 인터페이스”를 의미하며 사용 편의성을 위해 세마포 C 라이브러리를 가지고 있습니다. 그러나 Semaphore를 사용하는 경우 읽기가 매우 쉽기 때문에 표준 라이브러리를 사용하는 것이 좋습니다. 다음은 세마포 s c ++11을 사용 하 여 (또한 내 github에서 볼 수) 예제: 가정, 두 개의 스레드, 생산자와 소비자. 소비자가 먼저 실행된다고 가정합니다. 따라서 소비자는 sem_wait(full;)를 호출하지만, 전체 세마포는 값 0으로 초기화되고, 호출은 소비자를 차단하고 다른 스레드가 원하는 대로 세마포에 sem_post()를 호출할 때까지 기다립니다. 아래 코드는 명명된 세마포를 사용하고 있습니다. 명명된 세마포는 초기화되지 않고 열립니다. sem_open()은 세마포에 대한 포인터를 반환합니다.

아래 코드는 뮤텍스와 액세스를 동기화하는 또 다른 예를 보여줍니다. 액세스를 제어하기 위해 코드 섹션을 입력하기 전에 뮤텍스를 잠근 다음 완료되면 잠금을 해제합니다. 세마포가 설정되어 있는 동안 키보드 입력을 기다리고 있습니다. 입력이 있으면 첫 번째 스레드가 키보드 입력을 다시 읽기 전에 두 번째 스레드가 문자를 계산할 수 있도록 세마포어를 해제합니다. 그런 다음 생산자가 실행됩니다. sem_wait(∞)를 호출합니다. 소비자와 달리 생산자는 빈 값이 MAX(= 1)로 초기화되었기 때문에 이 줄을 통해 계속됩니다. 따라서 빈 0으로 감소 되 고 생산자 버퍼의 첫 번째 항목에 데이터 값을 넣어 집니다.

그런 다음 생산자는 계속 하여 sem_post(전체;)를 호출하여 전체 세마포의 값을 0에서 1로 변경하고 소비자를 깨우습니다(예: 차단된 상태에서 준비 상태로 이동). 예를 들어 소비자 스레드가 먼저 실행되는 경우를 가정해 보겠습니다. get()을 호출하여 아직 생성되지 않은 데이터를 수집하여 원하는 대로 작동하지 않습니다. 사용 또는 채우기 인덱스의 업데이트에 경합 조건이 있을 수 있으므로 여러 생산자 또는 소비자를 추가하면 상황이 악화됩니다. ISR은 현재 실행 중인 스레드의 컨텍스트에서 비동기적으로 실행됩니다. ISR에서 동기화 프리미티브의 가용성을 쿼리(차단 호출)하지 않는 것이 좋습니다. ISR은 짧은 의미, 뮤텍스/세마포에 대 한 호출 현재 실행 중인 스레드를 차단할 수 있습니다. 그러나 ISR은 세마포를 신호하거나 뮤텍스의 잠금을 해제할 수 있습니다. 코드에서 세마포는 5개로 초기화했습니다.

sem_init() 호출의 두 번째 매개 변수는 0이며 이렇게 하면 세마포를 스레드에 비공개로 만듭니다. 하나의 값을 전달하면 세마포를 여러 프로세스 간에 공유할 수 있습니다. 이러한 배열은 실제 시스템 내의 여러 곳에서 발생합니다. 예를 들어, 멀티 스레드 웹 서버에서 생산자는 HTTP 요청을 작업 큐에 넣습니다(즉, 바인딩된 버퍼). 소비자의 스레드 풀은 각각 작업 대기열에서 요청을 받아 요청을 처리합니다.

Os comentários foram encerrados, mas trackbacks e pingbacks estão abertos.