C++ マルチスレッド フレームワーク (2): Mutex ミューテックスと Sem セマフォ

黄舟
リリース: 2017-02-06 13:55:57
オリジナル
1670 人が閲覧しました

相互排除とセマフォはマルチスレッド プログラミングの 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 アドレス:

https://github.com/wyh267/Cplusplus_Thread_Lib

上記は C++ マルチスレッド フレームワーク (2): Mutex ミューテックスと Sem セマフォの内容です。その他の関連コンテンツについては、こちらをご覧ください。 PHP 中国語 Web サイト (www.php.cn) に注意してください。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート