상호 배제와 세마포어는 멀티스레드 프로그래밍의 두 가지 기초입니다. 해당 원리에 대해서는 자세히 설명하지 않겠습니다. 운영 체제 책을 읽거나 온라인에서 확인하세요.
상호 배제를 구현하려면 어떤 운영 체제든 세 단계가 필수입니다.
뮤텍스 잠금 초기화
잠금 작업
잠금 해제 작업
시스템마다 구현된 기능에는 약간의 차이만 있지만 기능은 실제로 유사합니다. 잠금 작업과 잠금 해제 작업 중에 대부분의 시스템에는 항상 잠기지 않도록 하는 타임아웃 메커니즘이 있습니다. 여기서는 프레임워크의 단순화를 위해 시간 초과를 설정하지 않았습니다. 잠금 작업 중에 잠금을 얻을 수 없으면 영원히 기다리게 됩니다.
Mutex의 기본 클래스는 다음과 같습니다
class CMutex { public: CMutex(const char *pName = NULL); //初始化锁 ~CMutex(); virtual bool Lock()=0; //锁操作,纯虚函数 virtual bool UnLock()=0; //解锁操作,纯虚函数 const char * getName(void) const { return mutex_name; } protected: char *mutex_name; //锁名字 };
각 시스템의 구현에는 초기화, 잠금 동작의 세 부분을 완료해야 합니다. , 잠금 해제 작업 Linux에서는 이 세 가지 작업이 매우 간단하므로 여기에 코드를 게시하지 않겠습니다.
마찬가지로 세마포어 Sem의 경우 각 시스템의 구현은 유사하며
세마포어 초기화
세마포어(세마포+1) 보내기
세마포어 수신(Semaphore - 1)
Sem 기본 클래스는 다음과 같습니다.
class CCountingSem { public: typedef enum { kTimeout, kForever }Mode; CCountingSem(); //初始化信号量 ~CCountingSem(); virtual bool Get() = 0; //接收信号量 virtual bool Post(void) = 0; //发送信号量 };
이와 같습니다 , 특정 구현에 대한 코드는 게시하지 않겠습니다.
물론 디자인 패턴을 만족하는 시스템을 위해서는 새로운 뮤텍스 락과 세마포어를 생성할 때 당연히 이러한 클래스를 직접 새로 만들 수는 없고 간단한 메소드를 통해 반환해야 합니다. 프로젝트의 경우 COperatingSystemFactory 클래스에 newMutex 및 newCountingSem 메서드를 추가하고 COperatingSystemFactory의 운영 체제 판단을 통해 해당 엔터티를 반환합니다.
class COperatingSystemFactory { public: static COperatingSystem *newOperatingSystem(); static CCountingSem *newCountingSem(unsigned int init=0); //参数是信号量的初始值,一般为0 static CMutex *newMutex(const char *pName=NULL); };
그럼 뮤텍스와 세마포어는 어떻게 사용하나요? 메인 함수에서 뮤텍스와 세마포어를 먼저 적용해보겠습니다. 이들 중 일부 사이에 뮤텍스 잠금이 필요한 경우 해당 스레드에 적용된 뮤텍스 잠금을 할당한 후 직접 사용할 수 있습니다. 각 스레드 클래스는 직접 작성하고 CThread에서 상속받았습니다. 내부의 멤버 변수가 main에서 적용된 뮤텍스 잠금과 어떻게 관련되는지는 말할 것도 없이 공개 할당으로 설정할 수도 있습니다. 비공개로 설정된 기능을 사용하면 모든 것이 귀하에게 달려 있습니다.
뮤텍스 잠금 및 세마포어를 사용하면 메시지 큐를 시작할 수 있으며 메시지 큐를 사용하면 가장 간단한 멀티스레딩 모델이 완성됩니다.
github 주소:
https://github.com/wyh267/Cplusplus_Thread_Lib
위는 C++ 멀티스레딩 프레임워크입니다. (2) :뮤텍스 상호 배제 및 Sem 세마포어 내용에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!