以下のページにあったスレッドプールを使用してみる。
使い方はこんな感じ。Runnableを継承したクラスに処理を書き、ThreadPoolにaddする。
#pragma warning(disable:4996) #include <iostream> // https://cutlassfish.wordpress.com/2016/09/14/c-%E3%81%A7-worker-thread-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/ #include "WorkerThread.hpp"
class Work1 : public Runnable { const char* _name; const int _count; public: Work1(const char* name,int count): _name(name),_count(count) {} virtual void run() override { for (int i = 0; i < 10; i++) { _sleep(_count); printf("%s == %d\n",_name, i); } } };
int main() { int thread_count = 5;// 同時に走るスレッドの数 int queue_count = 5;// 積んでおける仕事の数 ThreadPool pool(thread_count,queue_count); pool.add(std::make_shared<Work1>("h",20)); pool.add(std::make_shared<Work1>("i",25)); pool.add(std::make_shared<Work1>("o",30)); pool.add(std::make_shared<Work1>("k",35)); _sleep(5000); std::cout << "End of main\n"; }
構造的には、threadCount個のスレッドが作られ、それらがキューを監視し、キューにジョブが入っていたらそれをとってきて実行する、という構造になっている。
スレッド数を指定できる。同時に実行できる処理の数はスレッドの数だけ。
例えば以下のように指定する。
int main() {
int thread_count = 2; int queue_count = 5;
ThreadPool pool(thread_count,queue_count); pool.add(std::make_shared<Work1>("h",20)); pool.add(std::make_shared<Work1>("i",25)); pool.add(std::make_shared<Work1>("o",30)); pool.add(std::make_shared<Work1>("k",35)); _sleep(5000); std::cout << "End of main\n"; }
一度に処理できるのは二つまでなので、並列に処理されるのは二つだけだが、最終的に四つすべての処理が行われている。
キューの最大個数を2にすると、登録できる処理が二つだけになる。たとえ4個の処理をaddに与えても、キューに入りきらないものは捨てられている。
int thread_count = 5; int queue_count = 2;