00001 #ifndef GuardedVariable_HPP 00002 #define GuardedVariable_HPP 00003 00004 #include <iostream> 00005 00006 using namespace std; 00007 00008 #include <pthread.h> 00009 00020 template<typename T> 00021 class GuardedVariable{ 00022 00023 private: 00024 00025 volatile T variable; 00026 pthread_mutex_t lock; 00028 public: 00029 00035 GuardedVariable(T initialValue=0) 00036 :variable(initialValue){ 00037 00038 pthread_mutex_init(&lock, NULL); 00039 00040 } 00041 00047 T inc(){ 00048 00049 T tmp; 00050 pthread_mutex_lock(&lock); 00051 tmp = variable++; 00052 pthread_mutex_unlock(&lock); 00053 return tmp; 00054 00055 } 00056 00062 T dec(){ 00063 00064 T tmp; 00065 pthread_mutex_lock(&lock); 00066 tmp = variable--; 00067 pthread_mutex_unlock(&lock); 00068 return tmp; 00069 00070 } 00071 00075 T value(){ 00076 00077 T tmp; 00078 pthread_mutex_lock(&lock); 00079 tmp = variable; 00080 pthread_mutex_unlock(&lock); 00081 return tmp; 00082 00083 } 00084 00090 void set(T newValue){ 00091 pthread_mutex_lock(&lock); 00092 variable = newValue; 00093 pthread_mutex_unlock(&lock); 00094 } 00095 00096 00100 void reset(){ 00101 set(0); 00102 } 00103 00104 00105 00106 }; 00107 00108 00109 #endif//GuardedVariable_HPP