nlib
Barrier.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_THREADING_BARRIER_H_
4 #define INCLUDE_NN_NLIB_THREADING_BARRIER_H_
5 
6 #include "nn/nlib/Config.h"
7 
8 NLIB_NAMESPACE_BEGIN
9 namespace threading {
10 
11 // code snippets:
12 // Initialization:
13 // Barrier barrier;
14 // barrier.Init(N);
15 // Thread1 .. ThreadN:
16 // # do its own job
17 // barrier.Wait(); # wait other threads
18 // # do its own job
19 // barrier.Wait(); # wait other threads again
21  public:
22  Barrier() NLIB_NOEXCEPT : is_initialized_(false) {}
24  if (is_initialized_) {
25  errno_t e = nlib_barrier_destroy(&barrier_);
26  NLIB_ASSERT_NOERR(e);
27  NLIB_UNUSED(e);
28  }
29  }
30  errno_t Init(unsigned int count) NLIB_NOEXCEPT {
31  if (is_initialized_) return EAGAIN;
32  errno_t e = nlib_barrier_init(&barrier_, count);
33  NLIB_ASSERT_NOERR(e);
34  if (e != 0) return e;
35  is_initialized_ = true;
36  return 0;
37  }
39  NLIB_ASSERT(is_initialized_);
40  errno_t e = nlib_barrier_wait(&barrier_);
41  NLIB_ASSERT_NOERR(e);
42  return e;
43  }
44 
45  private:
46  nlib_barrier barrier_;
47  bool is_initialized_;
48 };
49 
50 } // namespace threading
51 NLIB_NAMESPACE_END
52 
53 #endif // INCLUDE_NN_NLIB_THREADING_BARRIER_H_
errno_t nlib_barrier_destroy(nlib_barrier *barrier)
バリアオブジェクトを破壊します。
任意の数のスレッドを同期するために使用します。
Definition: Barrier.h:20
errno_t Init(unsigned int count) noexcept
バリアを初期化します。
Definition: Barrier.h:30
struct nlib_barrier_ nlib_barrier
バリアオブジェクトの型です。
Definition: Platform.h:1329
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Config.h:86
開発環境別の設定が書かれるファイルです。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
Definition: Config.h:211
errno_t nlib_barrier_init(nlib_barrier *barrier, unsigned int count)
バリアオブジェクトを初期化します。
errno_t nlib_barrier_wait(nlib_barrier *barrier)
スレッドの待ち合わせを行います。
errno_t Wait() noexcept
スレッドの待ち合わせを行います。
Definition: Barrier.h:38
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24