diff options
Diffstat (limited to 'src/threads/mutex.cpp')
-rw-r--r-- | src/threads/mutex.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/threads/mutex.cpp b/src/threads/mutex.cpp index 0ae2a99..159f887 100644 --- a/src/threads/mutex.cpp +++ b/src/threads/mutex.cpp @@ -20,6 +20,7 @@ #include <iostream> #include "mutex.h" #include "thread.h" +#include <stdexcept> using namespace std; @@ -88,3 +89,39 @@ t_mutex_guard::t_mutex_guard(t_mutex &mutex) : mutex_(mutex) { t_mutex_guard::~t_mutex_guard() { mutex_.unlock(); } + + +/////////////////////////// +// t_rwmutex +/////////////////////////// + +t_rwmutex::t_rwmutex() +{ + int ret = pthread_rwlock_init(&_lock, nullptr); + if (ret != 0) throw string( + "t_rwmutex::t_rwmutex failed to create a r/w mutex."); +} + +t_rwmutex::~t_rwmutex() +{ + pthread_rwlock_destroy(&_lock); +} + +void t_rwmutex::lockRead() +{ + int err = pthread_rwlock_rdlock(&_lock); + if (err != 0) + throw std::logic_error("Mutex lock failed"); +} + +void t_rwmutex::lockWrite() +{ + int err = pthread_rwlock_wrlock(&_lock); + if (err != 0) + throw std::logic_error("Mutex lock failed"); +} + +void t_rwmutex::unlock() +{ + pthread_rwlock_unlock(&_lock); +} |