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 メソッドを呼び出し、メイン ループに入ります。
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 つだけ起動されるため、多くの不要な起動を減らすことができます。
io_service::work の役割: io_service::run は、タスクが完了するとすぐに戻ります。これは、常駐サービス プログラムを作成するときに必要なものではありません。boost が提供する解決策は、work を定義することです。一見すると io_server とは関係のないように見えるこの変数が、実際には run の動作を制御していることがわかります。 作業の実装は驚くほど単純です。コンストラクター内のio_serviceのworked_started()メソッドを使用して、保留中のタスクの数(outstanding_work_)が0より大きいようにします。この場合、io_service::runは処理すべきタスクが常に存在するとみなして戻りません。
AngularJS_AngularJSでのファクトリとサービスの使い方の紹介
#以上がboost::io_service の解釈の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。