スポンサーリンク

C++のスレッドプールのコードを見つけたのでコピペして動作確認してみた話

以下のページにあったスレッドプールを使用してみる。

使い方はこんな感じ。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個のスレッドが作られ、それらがキューを監視し、キューにジョブが入っていたらそれをとってきて実行する、という構造になっている。

注意1 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 queueSize

キューの最大個数を2にすると、登録できる処理が二つだけになる。たとえ4個の処理をaddに与えても、キューに入りきらないものは捨てられている。

  int thread_count = 5;
  int queue_count = 2;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: