boost::io_service の解釈
io_servie はタスク キューを実装します。タスクは void(void) 関数です。 Io_servie の最も一般的に使用される 2 つのインターフェイスは post と run です。Post はタスクをタスク キューに配信し、Run はすべての実行が完了するまでキュー内のタスクを実行します。run は N 個のスレッドによって呼び出すことができます。 Io_service は完全にスレッドセーフなキューです。
boost::io_service の解釈
asio は、boost によって提供される C 非同期プログラミング モデル ライブラリであり、そのコア クラス io_service は、主にソケットで使用される、マルチスレッド プログラミングでのタスク キューとタスク分散機能を提供します。 io プログラミングのイベント ドライバーとして (完了ポート、選択、ポーリング、epoll など)。
キュー モデル
各 io_service にはパブリック タスク キューと複数のプライベート タスク キューがあり、パブリック キューは各スレッドで共有され、プライベート キューは各スレッドに排他的です。
io_service のタスク実行プロセスは大まかに次のとおりです。
run メソッドを呼び出し、メイン ループに入ります。
- # パブリックキューが空かどうかを確認し、空でない場合はタスクを取り出して実行します。タスクの数が 1 より大きい場合は、他のアイドルスレッドも同時に起こします。時間;
- タスクの実行が完了し、各スレッドのプライベート キュー内のタスクがパブリック タスク キューに移動されます。イベントが発生すると、リアクターがトリガーされます。これは通常、Linux では epoll であり、対応するイベントのタスクがキューに入れられます。
- キューが空の場合、現在のスレッドをアイドル スレッド キューに追加し、待機状態に入り、他のスレッドが起動するのを待ちます (task_operation)。
- ユーザーが post を呼び出すと、タスクはパブリック キュー op_queue に直接配信されます。
- スレッド プール モデル一般的に使用されるスレッド プール モデルは 2 つあります。
using namespace boost;
using namespace boost::asio;
io_service ios;
int thread_num = 10;
thread *t[thread_num] = {0};
// 创建线程池
for(int i = 0; i < thread_num; ++i)
{
t[i] = new thread(bind(&io_service::run, &ios));
}
// 向任务队列中投递任务,该任务将随机由一个调用run方法的线程执行
ios.post(func);
// 等待线程退出
for(int i = 0; i < thread_num; ++i)
{
t[i]->join();
}
ログイン後にコピー
この種のスレッド プールのボトルネックはタスク キューであり、複数のスレッドであることは簡単にわかります。スレッドがアクセスをめぐって競合するため、大規模な同時プログラムではパフォーマンスが低下しやすくなります。 もう 1 つは、各スレッドがタスク キューを維持することです。ユーザーは、タスク キューの 1 つにタスクをランダムに配信するか、順番に配信するかを選択できます。タスク キュー内のタスクは、そのスレッドでのみ消費されます。にある。この種のスレッド プールには、ブーストの例にも対応する実装 (io_service_pool) があります。基本的な方法は、それぞれがスレッドに対応する複数の io_service オブジェクトを作成することです。コードは次のとおりです。 using namespace boost; using namespace boost::asio; io_service ios; int thread_num = 10; thread *t[thread_num] = {0}; // 创建线程池 for(int i = 0; i < thread_num; ++i) { t[i] = new thread(bind(&io_service::run, &ios)); } // 向任务队列中投递任务,该任务将随机由一个调用run方法的线程执行 ios.post(func); // 等待线程退出 for(int i = 0; i < thread_num; ++i) { t[i]->join(); }
Windows では一部のクラスの定義が異なるため、以下は Linux 環境に基づいたクラス図です。
#io_service はメイン インターフェイスを定義し、Linux での実装は task_io_service です。 task_io_service は主に 3 つのことを定義します。リアクター、リアクターは完了ポート、選択、ポーリング、epoll などのイベント ドライバーです。
パブリック タスク キュー op_queue は、ユーザーによって投稿されたタスクと、reactor によって返されたタスクを格納するために使用されます。 io_service 自体はスレッドを作成しませんが、スレッドのプライベート キューなどの一部のスレッド呼び出し情報を保存します。
さらに、task_io_service はアイドル スレッドのリストも維持し、追加のタスクが到着したときにアイドル スレッドの 1 つを起動します。一般的な Linux のシングル タスク キュー スレッド プールでは、スレッドをウェイクアップするために条件変数が使用されます。マルチコア システムでは、pthread_cond_signal 呼び出しによって待機状態の 1 つ以上のスレッドがウェイクアップされます (https://linux を参照)。 .die.net/man/3/pthread_cond_signal)、タスクは 1 つしかありませんが、アイドル スレッド方式を使用すると、タスクがあるときにアイドル スレッドが 1 つだけ起動されるため、多くの不要な起動を減らすことができます。
thread_info_base クラスは、メモリを 1 つだけ持つ単純なメモリ プールを維持し、メモリ解放を継続的に適用する場合にのみメモリ割り当てのオーバーヘッドを削減できます。 io_service::work の役割: io_service::run は、タスクが完了するとすぐに戻ります。これは、常駐サービス プログラムを作成するときに必要なものではありません。boost が提供する解決策は、work を定義することです。一見すると io_server とは関係のないように見えるこの変数が、実際には run の動作を制御していることがわかります。 作業の実装は驚くほど単純です。コンストラクター内のio_serviceのworked_started()メソッドを使用して、保留中のタスクの数(outstanding_work_)が0より大きいようにします。この場合、io_service::runは処理すべきタスクが常に存在するとみなして戻りません。
関連する推奨事項: - サービスのステータスに基づく Angular 更新ディレクティブ_AngularJS
AngularJS_AngularJSでのファクトリとサービスの使い方の紹介
#以上がboost::io_service の解釈の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック











Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです
