int sem_init(sem_t *sem, int pshared, 서명되지 않은 int 값); 세마포는 sem_init(프로세스 또는 스레드의 경우) 또는 sem_open(IPC의 경우)을 사용하여 초기화됩니다. 세마포는 프로세스 동기화 및 멀티스레딩에 매우 유용합니다. 그러나 예를 들어 C 언어로 말하는 실제 생활에서 하나를 사용하는 방법은 무엇입니까? (1) POSIX 세마포의 두 가지 종류가 있습니다 – 이름과 이름 – 그리고 당신은 둘 다 혼합하고 있습니다. 명명되지 않은 세마포는 sem_init 및 sem_destroy를 사용합니다. 명명 된 사용 sem_open, sem_close 및 sem_unlink. 스레드는 우아하고 효율적인 프로그램 작성을 크게 단순화할 수 있습니다. 그러나 이전 예제의 변수 cnt와 같이 여러 스레드가 공통 주소 공간을 공유하는 경우 문제가 있습니다. sem_init() 함수는 sem에 의해 언급된 명명되지 않은 세마포를 초기화한다. 초기화 세마포의 값은 값이어야 한다. sem_init()에 대한 성공적인 호출 후, 세마포는 sem_wait(), [TMO] sem_timewait(), sem_trywait(), sem_post() 및 sem_destroy()에 대한 후속 호출에 사용될 수 있습니다.

이 세마포는 세마포가 파괴 될 때까지 사용할 수 있습니다. 활동 2. 프로그램이 항상 예상 출력(값 2*NITER)을 생성하도록 프로그램 badcnt.c를 수정하는 가이드로 위의 예제를 사용합니다. 코드를 수정하기 전에 badcnt.c의 복사본을 goodcnt.c로 만듭니다. 훌륭한 간단한 예. mythread 변수를 해제하는 것을 기억하십시오. 실제로 힙에 mythread를 할당 할 필요가 없으며 일반적으로 8바이트 메모리가 필요한 긴 int 형식입니다. IEEE Std 1003.1-2001의 이 볼륨이 성공적인 반환 값을 지정하지 못하지만 sem_init() 호출이 성공하면 이후 버전에서 0값을 반환하기 위해 구현이 필요할 수 있습니다. man 3 sem_init에 따르면 sem_init()에 관한 한 프로토타입은 다음과 같이 합니다.

이 프로세스의 모든 스레드는 sem_wait(), [TMO] sem_timewait(), sem_trywait(), sem_post() 및 sem_destroy() 작업을 수행하는 데 sem을 사용할 수 있습니다. 동일한 프로세스에서 생성된 스레드 이외의 스레드에서 세마포를 사용하는 것은 정의되지 않습니다. 이에 대한 해결책은 다른 스레드가 사용 중인 데이터에 액세스하는 경우 스레드를 차단하는 함수를 제공하는 것입니다. Windows용 C 코드(C++가 아님)를 빌드하는 경우 이러한 헤더 파일은 또한 포함되어 있습니다: #include **// Windows VisualStudio. Linux #include ** #include **// Windows VisualStudio에서 Sleep()** 모든 POSIX 세마포 기능 및 유형을 사용하는 것은 세마포어에서 프로토타입화되거나 정의됩니다. 세마포 개체를 정의하려면 sem_t sem_name을 사용합니다. 컴파일은 gcc a.c -lpthread -lrt 아주 예기치 않은 으로 수행해야합니다! cnt는 0에서 시작하고 두 스레드 모두 NITER 시간을 증가시키기 때문에 프로그램의 끝에서 cnt가 2 * NITER와 동일합니다. 어떻게됩니까? . 설명 – 2개의 스레드가 생성되고 있으며, 첫 번째 스레드 후 2초 후에 생성됩니다. 그러나 첫 번째 스레드는 잠금을 획득한 후 4 초 동안 절전 모드로 유지됩니다. 따라서 두 번째 스레드가 호출 된 직후에 입력되지 않으며 호출 된 후 4 – 2 = 2 초가 들어갑니다. 따라서 이 코드가 직렬로 실행되는 경우(예: THREAD 1 을 먼저 실행한 다음 THREAD 2) 아무런 문제가 없습니다.

그러나 스레드는 임의의 순서로 실행되므로 pthread 및 세마포의 역학을 보여 주기 위해이 코드를 제공해 주셔서 감사합니다. sem 자체만 동기화를 수행하는 데 사용할 수 있습니다. sem_wait(), [TMO] sem_timewait(), sem_trywait(), sem_post() 및 sem_destroy()에 대한 호출에서 sem의 복사본을 참조한 결과는 정의되지 않습니다. 이미 초기화된 세마포를 초기화하려고 하면 정의되지 않은 동작이 발생합니다.