相互排除とセマフォはマルチスレッド プログラミングの 2 つの基礎です。その原理については詳しく説明しませんので、オペレーティング システムの本を読むか、オンラインで確認してください。
相互排除の実装には、どのOSであっても3つのステップが必須です
ミューテックスロックの初期化
ロック操作
ロック解除操作
システムが異なると、実装される機能に若干の違いがあるだけですが、実際、これらの関数はすべて似ています。ほとんどのシステムには、ロック操作およびロック解除操作中にタイムアウト メカニズムがあり、フレームワークを簡略化するためにタイムアウトを設定しません。ロック操作が実行できない場合は、ロックに移動し、そこで待機します。
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; //锁名字 };
各システムの実装には、初期化、ロック操作、ロック解除操作の3つの部分を完了する必要があります。 Linuxでは、この3つの操作は非常に重要です。コードはここに掲載されています。同様に、セマフォSEMの場合、各システムの実装は類似しており、セマフォのセマフォを発明するだけではありません(セマフォ + 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); };
それでは、ミューテックスとセマフォをどのように使用するのでしょうか? main 関数で、多くのスレッドを開始する場合、その一部がミューテックス ロックである場合、最初にミューテックス ロックとセマフォを適用できます。必要な場合は、適用されたミューテックス ロックを対応するスレッドに割り当て、直接使用できるようになります。各スレッドクラスは自分で書いてCThreadから継承しただけですが、その中のメンバ変数をmainに適用したmutexロックにどう関連付けるかを設定することもできます。プライベートから設定した機能を使用することもできます。すべてはあなた次第です。
ミューテックスロックとセマフォを使用すると、メッセージキューを開始でき、最も単純なマルチスレッドモデルが完成します。
github アドレス: