00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSUTIL_THREADING_BARRIER_H__
00020 #define __CS_CSUTIL_THREADING_BARRIER_H__
00021
00022 #include "csutil/noncopyable.h"
00023 #include "csutil/threading/condition.h"
00024 #include "csutil/threading/mutex.h"
00025
00026 namespace CS
00027 {
00028 namespace Threading
00029 {
00030
00037 class Barrier : private CS::NonCopyable
00038 {
00039 public:
00043 Barrier (size_t maxCount)
00044 : maxCount (maxCount), currentCount (0)
00045 {}
00046
00051 void Reset ()
00052 {
00053 currentCount = 0;
00054 }
00055
00060 bool Wait ()
00061 {
00062 MutexScopedLock lock (mutex);
00063 if (++currentCount < maxCount)
00064 {
00065 while (currentCount < maxCount)
00066 condition.Wait (mutex);
00067
00068 return false;
00069 }
00070 else
00071 {
00072 condition.NotifyAll ();
00073 return true;
00074 }
00075 }
00076
00077 private:
00078 Mutex mutex;
00079 Condition condition;
00080
00081 const size_t maxCount;
00082 volatile size_t currentCount;
00083 };
00084
00085 }
00086 }
00087
00088 #endif