c++ 세마포어 예제
예를 들어 소비자 스레드가 먼저 실행되는 경우를 가정해 보겠습니다. get()을 호출하여 아직 생성되지 않은 데이터를 수집하여 원하는 대로 작동하지 않습니다. 사용 또는 채우기 인덱스의 업데이트에 경합 조건이 있을 수 있으므로 여러 생산자 또는 소비자를 추가하면 상황이 악화됩니다. 이러한 배열은 실제 시스템 내의 여러 곳에서 발생합니다. 예를 들어, 멀티 스레드 웹 서버에서 생산자는 HTTP 요청을 작업 큐에 넣습니다(즉, 바인딩된 버퍼). 소비자의 스레드 풀은 각각 작업 대기열에서 요청을 받아 요청을 처리합니다. 함수 f2()에는 sem_wait()가 있으므로 함수 f1()이 sem_post(&mysemaphore)를 호출하여 세마포 값을 1로 늘릴 때까지 기다려야 합니다. 이 섹션에서는이 효과를 얻기 위해 세마포를 사용하는 방법을 볼 수 있습니다. 실제로 이전 섹션의 예제에서는 방법을 보여 주어 도있습니다. 그러나 여기에서는 매우 간단한 것부터 시작합니다. 세마포를 사용 하 여, 우리는 join()의 유사한 효과 달성할 수 있다. 코드에서 주 스레드는 작업자 스레드가 작업을 완료하기를 기다리고 있습니다.
세마포는 프로세스 동기화 및 멀티스레딩에 매우 유용합니다. 그러나 예를 들어 C 언어로 말하는 실제 생활에서 하나를 사용하는 방법은 무엇입니까? 세마포는 신호 메커니즘입니다 («나는 끝났어, 당신은 신호의 종류를 수행 할 수 있습니다»). 예를 들어 모바일에서 노래를 듣는 동시에 친구가 전화를 걸 때 인터럽트 서비스 루틴(ISR)이 호출 처리 작업을 깨우는 신호가 트리거됩니다. 운영 체제 용어에 따라 뮤텍스 및 세마포는 동기화 서비스를 제공하는 커널 리소스입니다(동기화 프리미티브라고도 함). 왜 우리는 이러한 동기화 프리미티브가 필요합니까? 하나만 충분하지 않을까요? 이러한 질문에 답하기 위해서는 몇 가지 키워드를 이해해야 합니다. 원자성 및 중요 섹션의 게시물을 읽어보시기 바랍니다. 일반적인 OS 텍스트 설명을 따르는 대신 이러한 개념을 잘 이해하기 위한 예제를 설명합니다. 이 예제는 두 프로세스를 동시에 실행합니다. cat notes.txt는 파일 notes.txt의 본문을 표준 출력이라고 생각하는 것에 씁니다. 그러나 대신 UNIX 셸은 출력을 UNIX 파이프(pipe() 시스템 호출에 의해 생성됨)으로 리디렉션했습니다.