C의 POSIX 세마포어

Cui Posix Semapo Eo



“모든 프로그래밍 언어에는 특정 목적을 위한 많은 라이브러리가 있지만 C의 POSIX 라이브러리에는 그 자리가 있습니다. 그것은 프로세스 간의 큰 조화를 만들도록 설계되었으며 프로그램 내에서 멀티스레딩을 사용하는 데 많은 도움이 됩니다. 즉, 여러 스레드를 만들고 실행을 동기화합니다. 오늘 이 가이드에서 C에서 POSIX 세마포를 사용하는 간단한 그림을 볼 수 있습니다. 기본 C 코드 예제의 경우 시스템에서 해당 컴파일러를 구성해야 합니다. 그러나 그 전에 시스템을 업데이트해야 합니다. 코드의 원활한 실행을 위한 필수 단계이기 때문입니다. 따라서 첨부된 스냅에 표시되는 쿼리는 'apt' 유틸리티를 사용하여 Linux 운영 체제를 업데이트하고 업그레이드하는 데 필수 항목입니다.'


이 프로세스는 업데이트를 원활하게 수행하기 위해 Linux 플랫폼에 약 55Kb의 공간이 필요했습니다. 그렇게 많은 공간을 제공하려면 'y'를 눌러 계속하십시오. 몇 분 안에 처리가 완료됩니다.








시스템이 완전히 업그레이드된 후 'install' 명령의 apt-get 유틸리티를 사용하여 시스템에서 C 언어의 컴파일러를 구성할 것입니다. 'gcc'를 키워드로 사용하면 됩니다.





sem_init()

's'에 이미 미확인 세마포어가 있을 때 새로운 세마포어가 생성됩니다. 그렇지 않으면 이미 존재하는 세마포어가 삭제됩니다. 이 방법 전체에서 's'는 구성된 세마포어 인스턴스를 나타내며 공유는 세마포어가 forked() 메서드로 배포될 수 있는지 여부를 나타내는 신호 또는 페넌트입니다. 입력 값은 세마포어의 설정 시작점 역할을 합니다.





정수 sem_init ( Nor_t * s, int 공유, unsigned int 값 ) ;

Sem_wait()

's'로 지정된 세마포어에 대해 세마포어 잠금 작업을 실행하여 sem_wait() 메서드는 해당 세마포어를 보유합니다. sem-wait 절차는 세마포어를 유지하거나 줄을 서도록 하는 데 사용됩니다. 이전에 오버로드된 일부 프로세스는 다른 프로세스가 sem_post()를 호출할 때 깨어납니다.



정수 sem_wait ( Nor_t * 에스 ) ;

no_post()

sem post가 호출되면 값이 증가하고 이전에 백업되었거나 대기 중인 작업 중 하나가 실행되기 시작합니다. 즉, 이미 잠긴 세마포어의 잠금을 해제합니다.

int sem_post ( Nor_t * 에스 ) ;

no_destroy()

초기화된 이름 없는 세마포 's'는 sem destroy() 함수를 사용하여 파괴됩니다.

정수 sem_destroy ( Nor_t * 에스 ) ;

예시

세마포어를 이해하기 위해 먼저 C 파일을 만든 다음 코드를 추가합니다. 하나를 만들려면 '터치' 쿼리를 사용하면 시스템의 홈 폴더에서 새 파일을 찾을 수 있습니다.


이제 좋은 코드를 생성하기 위해 간단한 편집기로 빈 C 파일을 열어야 합니다. 아래 스냅에서 볼 수 있듯이 우리는 지금까지 '나노' 편집기를 사용해 왔습니다.


우리 모두는 모든 프로그래밍 언어가 라이브러리 없이는 작동할 수 없다는 것을 알고 있습니다. 이러한 라이브러리에는 전체 시스템 작업에 활용되는 많은 수의 클래스, 구조, 함수 및 개체가 포함되어 있기 때문입니다. 그래서 우리는 POSIX 세마포어에 대한 몇 가지 기본 및 필수 라이브러리를 사용하여 이 C 프로그램을 시작합니다.

코드에서 이러한 라이브러리를 사용하려면 각 라이브러리에 대해 'include' 키워드와 함께 '#' 문자를 사용해야 합니다. 현재 이 프로그램에 반드시 있어야 하는 총 4개의 라이브러리를 추가했습니다. 그렇지 않으면 프로그램이 제대로 작동하지 않습니다. 첫 번째 'stdio.h' 헤더 라이브러리는 코드에서 입력 및 출력 작업을 수행할 수 있도록 하기 때문에 일반적으로 모든 C 프로그램에서 반드시 있어야 합니다. 따라서 이를 사용하여 입력을 원활하게 추가하고 코드에서 출력을 얻습니다. 여기서 우리가 사용하는 두 번째 라이브러리는 'pthread.h'입니다. 이것은 스레드 프로그래밍, 즉 멀티스레딩을 사용하기 위해 반드시 필요한 것입니다.

우리는 이 라이브러리를 사용하여 프로그램에서 스레드를 생성할 것입니다. 이 코드에서 다음으로 가장 중요한 라이브러리는 'semaphore.h'입니다. 스레드를 원활하게 동기화하기 위해 활용되었습니다. 마지막으로 중요한 것은 라이브러리가 'unistd.h'로 사용자 정의 기타 함수와 상수를 사용할 수 있게 해줍니다. 이제 세마포어 라이브러리의 'sem_t' 내장 객체를 사용하여 's' 세마포어를 선언했습니다. 여기에 반환 유형이 없는 스레드 사용자 정의 함수 'T'가 있습니다. 동기화를 수행하기 위해 몇 가지 내장 세마포어 기능을 활용하고 있습니다. sem_wait() 함수는 '&' 문자를 사용하여 세마포어 's'를 유지하기 위해 여기에 있습니다.

보류 내에서 printf() 문이 'sleep' 함수와 함께 실행되어 이 프로그램을 4초 동안 잠자기 상태로 만듭니다. 또 다른 printf() 문은 새 메시지를 표시하고 sem_post() 함수가 실행되어 세마포 's'에 대한 잠금을 해제합니다.

#include
#포함
#include <세마포어.h>
#include
둘 다 s;
무효의 * ( 무효의 * 인수 ) {
sem_wait ( & 에스 ) ;
인쇄 ( '어서 오십시오! \N ' ) ;
( 4 ) ;
인쇄 ( '안녕히 계세요! \N ' ) ;
sem_post ( & 에스 ) ;
}



세마포어에 대한 이 C 프로그램의 main() 메서드를 잘 살펴보겠습니다. 여기서 sem_init() 함수는 forked() 메서드로 배포되지 않은 새 세마포어 's'를 생성하는 데 사용되었습니다. 즉, '0'이며 시작점이 1로 설정됩니다. pthread의 pthread_t 객체 C 라이브러리는 두 개의 스레드 객체 o1 및 o2를 사용하여 두 개의 스레드를 생성하는 데 활용되었습니다. printf() 문은 바로 다음 줄에서 pthread_create() 함수를 사용하여 첫 번째 스레드를 생성할 것임을 표시합니다.

우리는 NULL 제한이 있는 이 함수에 o1 스레드 개체를 전달하고 매개 변수에 전달하여 함수 'T'를 호출했습니다. 4초의 휴면 후 다른 스레드가 객체 o2로 생성되었으며 여기서 pthread_join() 함수를 사용하여 스레드를 main() 함수와 결합합니다. sem_destroy() 함수는 's' 세마포어를 파괴하기 위해 여기에 있으며 차단된 모든 스레드도 해제됩니다.

정수 메인 ( ) {
sem_init ( & 에스, 0 , 1 ) ;
pthread_t o1, o2;
인쇄 ( '지금 1화에서... \N ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
( 4 ) ;
인쇄 ( '지금 2화에서... \N ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2, 널 ) ;
no_destroy ( & 에스 ) ;
반품 0 ;
}



우리는 'Gcc' 컴파일러로 C 프로그램을 컴파일하고 있습니다. '-lrt' 및 '-lpthread' 옵션은 POSIX 스레드 기능을 실행하는 데 사용됩니다. '.a/.out' 쿼리를 실행하면 첫 번째 스레드가 생성됩니다. 첫 번째 메시지를 인쇄한 후 절전 모드로 전환됩니다.


두 번째 스레드가 동기화되고 4초 후에 첫 번째 스레드가 해제되고 두 번째 스레드가 4초 동안 잠겨 있습니다.


결국 두 번째 스레드도 해제되었습니다.

결론

다른 스레드를 동기화하기 위해 주요 기능 중 일부를 활용하면서 C의 POSIX 세마포어에 관한 것입니다. 이 글을 보고 나면 POSIX를 점점 더 이해할 수 있을 것이다.