1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #ifndef LOCKER_H #define LOCKER_H
#include <exception> #include <pthread.h> #include <semaphore.h>
class sem { public: sem() { if (sem_init(&m_sem, 0, 0) != 0) { throw std::exception(); } } ~sem() { sem_destroy(&m_sem); } bool wait() { return sem_wait(&m_sem) == 0; } bool post() { return sem_post(&m_sem) == 0; }
private: sem_t m_sem; };
class locker { public: locker() { if (pthread_mutex_init(&m_mutex, NULL) != 0) { throw std::exception(); } }
~locker() { pthread_mutex_destroy(&m_mutex); }
bool lock() { return pthread_mutex_lock(&m_mutex) == 0; }
bool unlock() { return pthread_mutex_unlock(&m_mutex) == 0; }
private: pthread_mutex_t m_mutex; };
class cond { public: cond() { if (pthread_mutex_init(&m_mutex, NULL) != 0) { throw std::exception(); } if (pthread_cond_init(&m_cond, NULL) != 0) { pthread_mutex_destroy(&m_mutex); throw std::exception(); } }
~cond() { pthread_mutex_destroy(&m_mutex); pthread_cond_destroy(&m_cond); }
bool wait() { int ret = 0; pthread_mutex_lock(&m_mutex); ret = pthread_cond_wait(&m_cond, &m_mutex); pthread_mutex_unlock(&m_mutex); return ret == 0; }
bool signal() { return pthread_cond_signal(&m_cond) == 0; }
private: pthread_mutex_t m_mutex; pthread_cond_t m_cond; };
#endif
|
充分复用代码供后续使用。
reference:高性能服务器编程——游双P280