nlib
ThreadPool.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_THREADING_THREADPOOL_H_
4 #define INCLUDE_NN_NLIB_THREADING_THREADPOOL_H_
5 
6 #include "nn/nlib/Nqueue.h"
7 #include "nn/nlib/UniquePtr.h"
9 
10 NLIB_NAMESPACE_BEGIN
11 namespace threading {
12 
13 namespace detail {
14 class NLIB_VIS_PUBLIC ThPoolTaskBase {
15  public:
16  ThPoolTaskBase() NLIB_NOEXCEPT {}
17  virtual ~ThPoolTaskBase() NLIB_NOEXCEPT {}
18  virtual void operator()() NLIB_NOEXCEPT = 0;
19 
20  private:
21  NLIB_DISALLOW_COPY_AND_ASSIGN(ThPoolTaskBase);
22 };
23 
24 template <class R>
25 class ThPoolTask : public ThPoolTaskBase {
26  public:
27  explicit ThPoolTask(PackagedTask<R()>& task) NLIB_NOEXCEPT { // NOLINT
28  task.swap(m_Task);
29  }
30  virtual ~ThPoolTask() NLIB_NOEXCEPT NLIB_OVERRIDE {}
31  virtual void operator()() NLIB_NOEXCEPT NLIB_OVERRIDE { m_Task(); }
32 
33  private:
34  PackagedTask<R()> m_Task;
36 };
37 } // namespace detail
38 
40  public:
41  ThreadPool() NLIB_NOEXCEPT : m_Status(0) {}
42  NLIB_VIS_PUBLIC errno_t Init(size_t numThreads, const ThreadSettings& settings) NLIB_NOEXCEPT;
43  errno_t Init(size_t numThreads) NLIB_NOEXCEPT {
44  ThreadSettings settings;
45  return this->Init(numThreads, settings);
46  }
47  errno_t Init() NLIB_NOEXCEPT {
48  return this->Init(GetHardwareConcurrency());
49  }
50  NLIB_VIS_PUBLIC ~ThreadPool() NLIB_NOEXCEPT;
51  template <class R, class FUNC>
52  errno_t Submit(Future<R>* future, FUNC& func) NLIB_NOEXCEPT; // NOLINT
53  size_t Count() NLIB_NOEXCEPT { return m_ThreadList.size(); }
54 
55  private:
56  NLIB_VIS_HIDDEN void JoinThreads(Nlist<nlib_thread>& L) NLIB_NOEXCEPT; // NOLINT
57  static NLIB_VIS_HIDDEN void WorkerThread(void* p) NLIB_NOEXCEPT;
58 
59  int32_t m_Status;
60  nlib_mutex m_Lock;
61  Nlist<nlib_thread> m_ThreadList;
63  nlib_cond m_Cond;
65 };
66 
67 template <class R, class FUNC>
68 inline errno_t ThreadPool::Submit(Future<R>* future, FUNC& func) NLIB_NOEXCEPT { // NOLINT
69  PackagedTask<R()> task;
70  errno_t e = task.Init(func);
71  if (e != 0) return e;
72  if (future) {
73  e = task.GetFuture(future);
74  if (e != 0) return e;
75  }
76  UniquePtr<detail::ThPoolTaskBase> pTask(new (std::nothrow) detail::ThPoolTask<R>(task));
77  if (pTask) {
78  e = nlib_mutex_lock(&m_Lock);
79  NLIB_UNUSED(e);
80  NLIB_ASSERT_NOERR(e);
81  bool result = m_WorkQueue.push_back_swap(&pTask);
82  if (result) {
83  // only need to wake up one thread
84  e = nlib_cond_signal(&m_Cond);
85  NLIB_ASSERT_NOERR(e);
86  }
87  e = nlib_mutex_unlock(&m_Lock);
88  NLIB_ASSERT_NOERR(e);
89  return result ? 0 : ENOMEM;
90  } else {
91  return ENOMEM;
92  }
93 }
94 
95 } // namespace threading
96 NLIB_NAMESPACE_END
97 
98 #endif // INCLUDE_NN_NLIB_THREADING_THREADPOOL_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Platform.h:2151
errno_t nlib_cond_signal(nlib_cond *cond)
条件変数cond を待っているスレッドの1つの実行を再開させます。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:126
ThreadPool() noexcept
デフォルトコンストラクタです。Init()で初期化する必要があります。
Definition: ThreadPool.h:41
#define NLIB_OVERRIDE
利用可能であればoverrideが定義されます。そうでない場合は空文字列です。
#define NLIB_VIS_HIDDEN
関数やクラス等のシンボルをライブラリの外部に公開しません。
Definition: Platform_unix.h:50
errno_t nlib_mutex_lock(nlib_mutex *mutex)
与えられたmutexをロックします。
errno_t nlib_mutex_unlock(nlib_mutex *mutex)
与えられたmutex をアンロックします。
std::queueに似た、コピーコンストラクタを持たないオブジェクトを格納可能なコンテナ類似クラスです。 ...
Definition: Nqueue.h:16
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
Definition: UniquePtr.h:96
std::unique_ptrに相当するクラスが定義されています。
nlib_thread_attrをラップするクラスです。必要に応じて自動的にnlib_thread_attr_init()とnlib_thread_attr...
Definition: Thread.h:16
errno_t GetFuture(Future< R > *p) noexcept
実行結果を取得するためのFutureを設定します。
errno_t Init() noexcept
スレッドを起動してスレッドプールを初期化します。
Definition: ThreadPool.h:47
pthread_cond_t nlib_cond
条件変数オブジェクトの型です。
別のスレッド実行の出力をスレッドセーフに取得するためのクラスです。C++11のstd::shared_futureに似ていま...
Definition: AsyncFileIo.h:13
errno_t Init(size_t numThreads) noexcept
スレッドを起動してスレッドプールを初期化します。
Definition: ThreadPool.h:43
size_t GetHardwareConcurrency() noexcept
ハードウェアスレッドの数を返します。
Definition: Thread.h:760
pthread_mutex_t nlib_mutex
ミューテックス変数の型です。
関数をラップし、別スレッドで実行し戻り値をスレッドセーフに取得できるようにするクラスです。C++11のstd:...
Definition: Future.h:914
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:51
マルチスレッドプログラミングのためのFutureパターンを実装しています。
予めプールされた作成済みのスレッドに対してタスクを投入することができます。
Definition: ThreadPool.h:39
errno_t Init(FUNC &func)
初期化を行います。
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24