Heim >Java >javaLernprogramm >boost::io_service-Interpretation
io_servie implementiert eine Aufgabenwarteschlange, wobei die Aufgabe die Funktion void(void) ist. Die beiden am häufigsten verwendeten Schnittstellen von Io_servie sind Post und Run. Post liefert Aufgaben in der Warteschlange, bis alle ausgeführt sind, und Run kann von N Threads aufgerufen werden. Io_service ist eine vollständig threadsichere Warteschlange.
boost::io_service-Interpretation
asio ist eine von Boost bereitgestellte asynchrone C++-Programmiermodellbibliothek. Ihre Kernklasse io_service stellt Aufgabenwarteschlangen- und Aufgabenverteilungsfunktionen hauptsächlich in der Multithread-Programmierung bereit Wird als Ereignistreiber in der IO-Programmierung verwendet (Abschlussport, Auswahl, Umfrage, Epoll usw.).
Jeder io_service verfügt über eine öffentliche Aufgabenwarteschlange und mehrere private Aufgabenwarteschlangen. Die öffentliche Warteschlange wird von jedem Thread gemeinsam genutzt und die private Warteschlange ist exklusiv für jeden Thread.
Der Aufgabenausführungsprozess von io_service ist ungefähr wie folgt:
Rufen Sie die Ausführungsmethode auf und geben Sie die Hauptschleife ein; >
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(); }Es ist leicht zu erkennen, dass der Engpass dieser Art von Thread-Pool eine Aufgabenwarteschlange ist, und zwar mehrere Threads konkurrieren um Zugriff, was bei großen gleichzeitigen Programmen leicht zu Leistungseinbußen führen kann. Das andere ist, dass jeder Thread eine Aufgabenwarteschlange verwaltet, die Aufgaben zufällig oder abwechselnd an eine der Aufgabenwarteschlangen senden kann. Die Aufgaben in der Aufgabenwarteschlange können nur von dem Thread verbraucht werden es liegt. Diese Art von Thread-Pool verfügt im Boost-Beispiel auch über eine entsprechende Implementierung (io_service_pool). Die grundlegende Methode besteht darin, mehrere io_service-Objekte zu erstellen, die jeweils einem Thread entsprechen. Der Code lautet wie folgt:
using namespace boost; using namespace boost::asio; int thread_num = 10; io_service ios[thread_num]; thread *t[thread_num] = {0}; // 创建线程池 for(int i = 0; i < thread_num; ++i) { t[i] = new thread(bind(&io_service::run, &ios[i])); } // 轮训投递任务 for(int i = 0; i < thread_num; ++i) { ios[i].post(func); } // 等待线程退出 for(int i = 0; i < thread_num; ++i) { t[i]->join(); }Das Folgende ist ein Klassendiagramm, das auf einer Linux-Umgebung basiert, da einige Klassen unter Windows unterschiedliche Definitionen haben. io_service definiert die Hauptschnittstelle und die Implementierung unter Linux ist task_io_service. task_io_service definiert hauptsächlich drei Dinge:
Angular aktualisiert Directive_AngularJS entsprechend dem Status des Dienstes
Einführung in die Methoden zur Verwendung von Factory und Service in AngularJS_AngularJS
Das obige ist der detaillierte Inhalt vonboost::io_service-Interpretation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!