CS/C++

[Mastering C++ Programming] - Semaphore

sliver__ 2022. 12. 9. 16:08
728x90
  • 세마포어는 또 다른 유용한 스레드 동기화 메커니즘입니다. 
  • 그러나 뮤텍스와 달리 세마포어는 둘 이상의 스레드가 유사한 공유 리소스에 동시에 액세스할 수 있도록 합니다. 
  • 동기화 프리미티브는 두 가지 유형, 즉 이진 세마포어와 카운팅 세마포어를 지원합니다.

  • 바이너리 세마포어는 뮤텍스처럼 작동합니다. 
  • 즉, 어느 시점에서든 하나의 스레드만 공유 리소스에 액세스할 수 있습니다. 
  • 그러나 차이점은 뮤텍스 잠금은 이를 소유한 동일한 스레드에 의해서만 해제될 수 있다는 것입니다. 
  • 그러나 세마포어 잠금은 모든 스레드에서 해제할 수 있습니다. 
  • 다른 주목할만한 차이점은 일반적으로 뮤텍스는 프로세스 경계 내에서 작동하는 반면 세마포어는 프로세스 경계에서 사용된다는 것입니다. 
  • 뮤텍스와 달리 무거운 잠금이기 때문입니다. 
  • 그러나 공유 메모리 영역에서 생성된 경우 프로세스 전체에서 뮤텍스를 사용할 수도 있습니다.

  • 카운팅 세마포어를 사용하면 여러 스레드가 제한된 수의 공유 리소스를 공유할 수 있습니다. 
  • 뮤텍스를 사용하면 한 번에 하나의 스레드가 공유 리소스에 액세스할 수 있지만 카운팅 세마포어를 사용하면 여러 스레드가 제한된 수의 리소스(일반적으로 둘 이상)를 공유할 수 있습니다. 
  • 공유 리소스가 한 번에 하나의 스레드에 액세스해야 하지만 스레드가 프로세스 경계를 넘어 있는 경우 바이너리 세마포어를 사용할 수 있습니다. 
  • 같은 프로세스 내에서 바이너리 세마포어를 사용하는 것은 바이너리 세마포어가 무겁기 때문에 가능하지만 효율적이지는 않지만 같은 프로세스 내에서도 작동합니다.

  • 안타깝게도 C++ 스레드 지원 라이브러리는 C++17까지 기본적으로 세마포어와 공유 메모리를 지원하지 않습니다. 
  • C++17은 atomic operation이 스레드로부터 안전한지 확인해야 하는 atomic operation을 사용하는 lock-free 프로그래밍을 지원합니다. 
  • 세마포어 및 공유 메모리를 사용하면 다른 프로세스의 스레드가 공유 리소스를 수정할 수 있습니다. 
  • Concurrency 모듈이 프로세스 경계를 넘어 atomic 작업의 스레드 안전을 보장하는 것은 상당히 어렵습니다. 

  • 그러나 스레드 지원 라이브러리에서 제공하는 뮤텍스 및 조건 변수를 사용하여 자신의 세마포어를 구현하는 것을 막지는 않습니다. 
  • 프로세스 경계 내에서 공통 리소스를 공유하는 사용자 지정 세마포어 클래스를 개발하는 것은 비교적 쉽지만 세마포어에는 명명된 것과 명명되지 않은 두 가지 종류가 있습니다. 
  • 명명된 세마포어는 까다로운 경계를 넘어 공통 리소스를 동기화하는 데 사용됩니다.

  • 또는 명명된 세마포어와 명명되지 않은 세마포어를 모두 지원하는 POSIX pthreads 세마포 프리미티브 주위에 래퍼 클래스를 작성할 수 있습니다. 
  • cross platform 애플리케이션을 개발하는 경우 모든 플랫폼에서 작동하는 이식 가능한 코드를 작성해야 합니다. 
728x90