C++ マルチスレッド フレームワーク (1): 新しいスレッドを一度に開始します
数年前に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

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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