数年前にC++のマルチスレッドフレームワークを書いたのですが、一度説明するのが面倒になって消えてしまいましたので、最近コードを整理してgithubに送る準備をしました。このフレームワークをまとめてみましょう。
マルチスレッドは、特に Linux C++ のプログラミングにおいて常に一般的な問題であり、もちろん、boost など、利用可能なサードパーティ ライブラリが数多くあります。しかし、場合によっては、そのような巨大なライブラリは必要なく、軽量のスレッド フレームワークが必要なだけなので、現在は Linux でのみ使用されますが、必要に応じてマルチプラットフォームで使用できるように設計されています。 、いくつかのクラスを自分で追加し、eCos、Vxworks などの他のプラットフォーム用の Windows プラットフォームに変えることができます。 。
マルチスレッドの場合、ユーザーがプログラムを作成するときにスレッド間のロジックではなくコードのロジックにもっと注意を払えるように、オペレーティング システムの最下層をカプセル化することが最善です。新しいクラスを作成すると、スレッドが開始され、スレッド間の通信も対応するクラスによってカプセル化されます。
これらに基づいて、さまざまなマルチスレッドインターフェイスをカプセル化するための基本クラスのセットを定義しました
このクラスは主に、スレッドを作成するための createThread 関数を定義します。この関数は純粋な仮想関数です。関数、それから継承されたクラスはプラットフォームに従って関数を実装する必要があります
class COperatingSystem { public: COperatingSystem(); ~COperatingSystem(); virtual bool createThread(CThread *mThread,unsigned long stack_size=8*1024)=0; virtual void sleepSec(unsigned long sec)=0; protected: CThread *p_thread; };
スレッド基本クラスはスレッドのエントリポイントとしてthreadEntryを定義し、スレッドを初期化するinitializeThread、サブクラスはさまざまなメンバー変数を初期化できますmainLoop スレッドのメイン関数である純粋な仮想関数です。通常、サブクラスはこの仮想関数を実装する必要があります。
class CThread { public: CThread(const char *m_thread_name); ~CThread(); void threadEntry(CCountingSem *pSemaphore); protected: virtual bool initializeThread(); virtual void mainLoop()=0; COperatingSystem *p_opration_system; char *p_thread_name; };
プラットフォームに依存しないようにするために、単純なファクトリ パターンを使用して、さまざまなプラットフォームに応じてさまざまなオペレーティング システム クラス、セマフォ クラス、および相互排他クラスを返します。
class COperatingSystemFactory { public: static COperatingSystem *newOperatingSystem(); static CCountingSem *newCountingSem(unsigned int init); static CMutex *newMutex(const char *pName=NULL); };
セマフォ基本クラス、純粋仮想関数はgetおよびpostセマフォメソッドを定義し、サブクラスはシステムタイプに応じて異なる実装を実装する必要があります
class CCountingSem { public: CCountingSem(); ~CCountingSem(); virtual bool Get(Mode mode = kForever, unsigned long timeoutMS = 0) = 0; virtual bool Post(void) = 0; };
相互排他基本クラス、純粋仮想関数は同様にロックおよびロック解除メソッドを定義します, サブクラスはシステムの種類に応じて実装する必要があります
class CMutex { public: CMutex(const char *pName = NULL); ~CMutex(); virtual bool Lock()=0; virtual bool UnLock()=0; protected: char *mutex_name; };
もう一つ重要なことはmsgQueueクラスですが、これについては次回説明します。
これらの基本的なクラスを受講したら、開始できます。
ユーザー、つまりプログラマが CThread から CTestThread などの独自のスレッド クラスを継承し、mainLoop メソッドを実装することを期待します。これで、main.cpp に CTestThread を新規作成するだけで、他の面倒な操作を行わずにスレッドが開始されます。
そのような機能を実現するには、上記のクラスに対してどのような組み合わせの呼び出しが必要ですか?
まず第一に、Linux の下にあるため、すべての基本クラスは Linux に対応するサブクラスを派生する必要があります (CThread はユーザーによって作成されるため必要ありません。また、COperatingSystemFactory は抽象クラスであるため必要ありません)ファクトリー)、そこで、Linux 上で CLinuxMutex、CLinuxOperatingSystem、および CLinuxCountingSem の 3 つのサブクラスを作成し、これらのサブクラスの基本クラスに純粋な仮想関数を実装しました。
次に、新しい CTestThread を作成した後、COperatingSystemFactory の newOperatingSystem を通じて CLinuxOperatingSystem を生成する必要があります。その後、CLinuxOperatingSystem は createThread を呼び出してスレッド関数を生成し、CTestThread の mainLoop をこのスレッド関数にバインドします。
はい、とても簡単です
github にすべてのファイルをダウンロードしたら、次のような独自のスレッド クラスを記述するだけです:
class TestThread:public CThread { public: TestThread(const char *m_name); ~TestThread(); virtual void mainLoop(); }; //然后实现mainLoop方法: void TestThread::mainLoop() { while(1) { printf("%s :hello world\n",p_thread_name); } }
次に、main.cpp でこれを呼び出します新しい文でクラスを作成します:
TestThread *a=new TestThread("Thread A");
OK、すべてが完了しました。実行してください。連続して hello world と入力できます。
githubアドレス:
https://github.com/wyh267/Cplusplus_Thread_Lib