TNB Library
TnbCyclicBarrier.h
[詳解]
1#pragma once
11#include "TnbSync.h"
12
13
14
15//T-TestCaseコードカバレッジDisable
16#pragma comment(user,"T-Coverage Disable")
17
18
19
20//TNB Library
21namespace TNB
22{
23
24
25
39{
40public:
41
55 struct IListener
56 {
58 virtual ~IListener(void) {}
59
68 virtual void OnGathered(void) = 0;
69 };
70
71private:
72
73 int m_iParties;
74 IListener* m_piListener;
75 CSyncEvent* m_psyncEvent;
76 LONG m_lWaitingCount;
77 CSyncSection m_syncParam;
78 CSyncSemaphore* m_psyncSema;
79 LONG m_lWaitExecutingCount;
80 bool m_boIsReset;
81
82public:
83
89 explicit CCyclicBarrier(int iParties = 2, IListener* I = NULL)
90 {
91 m_psyncEvent = NULL;
92 m_psyncSema = NULL;
93 m_iParties = 0;
94 m_piListener = NULL;
95 m_boIsReset = false;
96 m_lWaitingCount = 0;
97 m_lWaitExecutingCount = 0;
98 Init(iParties, I);
99 }
100
106 {
107 Reset();
108 while ( m_lWaitExecutingCount != 0 )
109 {
110 ::Sleep(10);
111 }
112 if ( m_psyncSema != NULL )
113 {
114 delete m_psyncSema;
115 }
116 if ( m_psyncEvent != NULL )
117 {
118 delete[] m_psyncEvent;
119 }
120 }
121
131 bool Init(int iParties = 2, IListener* I = NULL)
132 {
133 if ( iParties < 2 )
134 {
135 ASSERT0(false, "CCyclicBarrier::Init()", "パーティ数が異常です。");
136 return false;
137 }
138 Reset();
139 while ( m_lWaitExecutingCount != 0 )
140 {
141 ::Sleep(10);
142 }
143 if ( m_psyncSema != NULL )
144 {
145 delete m_psyncSema;
146 }
147 m_psyncSema = new CSyncSemaphore(NULL, iParties);
148 //
149 if ( m_iParties != iParties )
150 {
151 if ( m_psyncEvent != NULL )
152 {
153 delete[] m_psyncEvent;
154 }
155 m_psyncEvent = new CSyncEvent[iParties];
156 m_iParties = iParties;
157 }
158 m_piListener = I;
159 loop ( i, m_iParties )
160 {
161 m_psyncEvent[i].ToLock();
162 }
163 m_lWaitingCount = 0;
164 return true;
165 }
166
172 void Reset(void)
173 {
174 m_boIsReset = true;
175 for ( int i = m_iParties - 1; i >= 0; i-- )
176 {
177 m_psyncEvent[i].Unlock();
178 }
179 }
180
187 int Wait(void)
188 {
189 ::InterlockedIncrement(&m_lWaitExecutingCount);
190 LONG lNo = 0;
191 int iRc = 0;
192 SYNCBLOCK(m_psyncSema)
193 {
194 SYNCBLOCK(&m_syncParam)
195 {
196 lNo = m_lWaitingCount++;
197 if ( lNo == 0 )
198 {
199 //== TopWaiter
200 m_boIsReset = false;
201 loop ( i, m_iParties )
202 {
203 m_psyncEvent[i].ToLock();
204 }
205 }
206 }
207 //
208 if ( lNo == 0 )
209 {
210 //== TopWaiter
211 for ( int i = 1; i < m_iParties; i++ )
212 {
213 m_psyncEvent[i].Lock(); //他のWaiter待ち
214 }
215 if ( ! m_boIsReset )
216 {
217 EXCLUSIVE(&m_syncParam);
218 if ( m_piListener != NULL )
219 {
220 m_piListener->OnGathered();
221 }
222 m_psyncEvent[0].Unlock();
223 m_lWaitingCount = 0;
224 iRc = 0;
225 }
226 else
227 {
228 iRc = -1;
229 }
230 break;
231 }
232 else if ( m_iParties > lNo )
233 {
234 //== 後続のWaiter
235 m_psyncEvent[lNo].Unlock();
236 m_psyncEvent[0].Lock(); // TopWaiter待ち
237 iRc = (m_boIsReset) ? -1 : lNo;
238 break;
239 }
240 else
241 {
242 ASSERTLIB(false); //こないはず
243 }
244 }
245 ::InterlockedDecrement(&m_lWaitExecutingCount);
246 return iRc;
247 }
248
253 int GetNumberWaiting(void) { return m_lWaitingCount; }
254
259 int GetParties(void) { return m_iParties; }
260};
261
262
263
264}; // TNB
265
266
267
268//T-TestCaseコードカバレッジEnable
269#pragma comment(user,"T-Coverage Enable")
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
同期処理関係のヘッダ
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbSync.h:91
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
バリアクラス
int Wait(void)
[排他] ウェイト
~CCyclicBarrier(void)
デストラクタ
bool Init(int iParties=2, IListener *I=NULL)
[設定] 初期化
CCyclicBarrier(int iParties=2, IListener *I=NULL)
コンストラクタ
int GetParties(void)
[取得] パーティ数
void Reset(void)
[操作] リセット
int GetNumberWaiting(void)
[取得] 待機数
Event排他管理クラス
Definition: TnbSync.h:480
void ToLock(void)
[排他] ロック状態にする
Definition: TnbSync.h:544
virtual void Unlock(void) const
[排他] アンロック
Definition: TnbSync.h:532
Section排他管理クラス
Definition: TnbSync.h:125
Semaphore排他管理クラス
Definition: TnbSync.h:370
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
#define SYNCBLOCK(CLS)
簡易排他ブロック制御マクロ.
Definition: TnbSync.h:912
TNB Library
Definition: TnbDoxyTitle.txt:2
バリアクラスのリスナーインターフェース
virtual ~IListener(void)
デストラクタ
virtual void OnGathered(void)=0
[通知] そろった通知