ホームページ バックエンド開発 C#.Net チュートリアル C++ マルチスレッド フレームワーク (1): 新しいスレッドを一度に開始します

C++ マルチスレッド フレームワーク (1): 新しいスレッドを一度に開始します

Feb 06, 2017 pm 01:51 PM

数年前に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 と入力できます。

同様に、複数のインスタンスを新規作成することもできます

他の機能を備えたスレッドが必要な場合は、CThread から別のクラスを派生するだけです。非常に簡単です。

少し複雑なのはスレッド通信ですが、これについては次回お話します。

コードはまだ整理されていませんが、整理されてgithubにアップロードされるまでに2、3日ほどかかります。

githubアドレス:

https://github.com/wyh267/Cplusplus_Thread_Lib

上記はC++マルチスレッドフレームワーク(1)の内容です: newは一度にスレッドを開始します。 PHP Chinese Net (www.php.cn) にご注意ください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C文字列におけるcharの役割は何ですか C文字列におけるcharの役割は何ですか Apr 03, 2025 pm 03:15 PM

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

マルチスレッドをC言語で実装する4つの方法 マルチスレッドをC言語で実装する4つの方法 Apr 03, 2025 pm 03:00 PM

言語のマルチスレッドは、プログラムの効率を大幅に改善できます。 C言語でマルチスレッドを実装する4つの主な方法があります。独立したプロセスを作成します。独立して実行される複数のプロセスを作成します。各プロセスには独自のメモリスペースがあります。擬似マルチスレッド:同じメモリ空間を共有して交互に実行するプロセスで複数の実行ストリームを作成します。マルチスレッドライブラリ:pthreadsなどのマルチスレッドライブラリを使用して、スレッドを作成および管理し、リッチスレッド操作機能を提供します。 Coroutine:タスクを小さなサブタスクに分割し、順番に実行する軽量のマルチスレッド実装。

c-subscript 3 subscript 5 c-subscript 3 subscript 5アルゴリズムチュートリアルを計算する方法 c-subscript 3 subscript 5 c-subscript 3 subscript 5アルゴリズムチュートリアルを計算する方法 Apr 03, 2025 pm 10:33 PM

C35の計算は、本質的に組み合わせ数学であり、5つの要素のうち3つから選択された組み合わせの数を表します。計算式はC53 = 5です! /(3! * 2!)。これは、ループで直接計算して効率を向上させ、オーバーフローを避けることができます。さらに、組み合わせの性質を理解し、効率的な計算方法をマスターすることは、確率統計、暗号化、アルゴリズム設計などの分野で多くの問題を解決するために重要です。

個別の関数使用距離関数C使用チュートリアル 個別の関数使用距離関数C使用チュートリアル Apr 03, 2025 pm 10:27 PM

std :: uniqueは、コンテナ内の隣接する複製要素を削除し、最後まで動かし、最初の複製要素を指すイテレーターを返します。 STD ::距離は、2つの反復器間の距離、つまり、指す要素の数を計算します。これらの2つの機能は、コードを最適化して効率を改善するのに役立ちますが、隣接する複製要素をstd ::のみ取引するというような、注意すべき落とし穴もあります。 STD ::非ランダムアクセスイテレーターを扱う場合、距離は効率が低くなります。これらの機能とベストプラクティスを習得することにより、これら2つの機能の力を完全に活用できます。

C言語でヘビの命名法を適用する方法は? C言語でヘビの命名法を適用する方法は? Apr 03, 2025 pm 01:03 PM

C言語では、Snake命名法はコーディングスタイルの慣習であり、アンダースコアを使用して複数の単語を接続して可変名または関数名を形成して読みやすくします。編集と操作、長い命名、IDEサポートの問題、および歴史的な荷物を考慮する必要がありますが、それは影響しませんが。

c c Apr 04, 2025 am 07:54 AM

CのRelease_Semaphore関数は、取得したセマフォをリリースするために使用され、他のスレッドまたはプロセスが共有リソースにアクセスできるようにします。セマフォのカウントを1増加し、ブロッキングスレッドが実行を継続できるようにします。

dev-cバージョンの問題 dev-cバージョンの問題 Apr 03, 2025 pm 07:33 PM

dev-c 4.9.9.2コンピレーションエラーとソリューションdev-c 4.9.9.2を使用してWindows 11システムでプログラムをコンパイルする場合、コンパイラレコードペインには次のエラーメッセージが表示されます。gcc.exe:internalerror:aborted(programcollect2)pleaseubmitafullbugreport.seeforintructions。最終的な「コンピレーションは成功しています」ですが、実際のプログラムは実行できず、エラーメッセージ「元のコードアーカイブはコンパイルできません」がポップアップします。これは通常、リンカーが収集されるためです

Cおよびシステムプログラミング:低レベルのコントロールとハードウェアの相互作用 Cおよびシステムプログラミング:低レベルのコントロールとハードウェアの相互作用 Apr 06, 2025 am 12:06 AM

Cは、ハードウェアに近い制御機能とオブジェクト指向プログラミングの強力な機能を提供するため、システムプログラミングとハードウェアの相互作用に適しています。 1)cポインター、メモリ管理、ビット操作などの低レベルの機能、効率的なシステムレベル操作を実現できます。 2)ハードウェアの相互作用はデバイスドライバーを介して実装され、Cはこれらのドライバーを書き込み、ハードウェアデバイスとの通信を処理できます。

See all articles