summaryrefslogtreecommitdiffstats
path: root/src/threads
diff options
context:
space:
mode:
Diffstat (limited to 'src/threads')
-rw-r--r--src/threads/mutex.cpp37
-rw-r--r--src/threads/mutex.h42
2 files changed, 79 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);
+}
diff --git a/src/threads/mutex.h b/src/threads/mutex.h
index 9970e08..16f314d 100644
--- a/src/threads/mutex.h
+++ b/src/threads/mutex.h
@@ -21,6 +21,7 @@
#include <errno.h>
#include <pthread.h>
+// #include <iostream>
/**
* @file
@@ -83,4 +84,45 @@ public:
~t_mutex_guard();
};
+class t_rwmutex {
+protected:
+ pthread_rwlock_t _lock;
+public:
+ t_rwmutex();
+ ~t_rwmutex();
+
+ void lockRead();
+ void lockWrite();
+ void unlock();
+};
+
+class t_rwmutex_reader {
+private:
+ t_rwmutex& _mutex;
+public:
+ t_rwmutex_reader(t_rwmutex& mutex) : _mutex(mutex) {
+ // std::cout << "mtx rd lock " << (void*)&_mutex << std::endl;
+ _mutex.lockRead();
+ }
+ ~t_rwmutex_reader() {
+ // std::cout << "mtx rd unlock " << (void*)&_mutex << std::endl;
+ _mutex.unlock();
+ }
+};
+
+class t_rwmutex_writer {
+private:
+ t_rwmutex& _mutex;
+public:
+ t_rwmutex_writer(t_rwmutex& mutex) : _mutex(mutex) {
+ // std::cout << "mtx wr lock " << (void*)&_mutex << std::endl;
+ _mutex.lockWrite();
+ }
+ ~t_rwmutex_writer() {
+ // std::cout << "mtx wr unlock " << (void*)&_mutex << std::endl;
+ _mutex.unlock();
+ }
+};
+
+
#endif