From 13684e6c58ed3f0bd6fd811125e31fc3a37bda21 Mon Sep 17 00:00:00 2001 From: Pixel Date: Thu, 13 Oct 2011 23:52:31 -0700 Subject: Adding a Thread and a Queue class. --- includes/Threads.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'includes/Threads.h') diff --git a/includes/Threads.h b/includes/Threads.h index 5a4ef61..2347a84 100644 --- a/includes/Threads.h +++ b/includes/Threads.h @@ -1,9 +1,13 @@ #pragma once +#include #include namespace Balau { +template +class Queue; + class Lock { public: Lock(); @@ -12,6 +16,51 @@ class Lock { void leave() { pthread_mutex_unlock(&m_lock); } private: pthread_mutex_t m_lock; + template + friend class Queue; +}; + +class ThreadHelper; + +class Thread { + public: + virtual ~Thread(); + void threadStart(); + void * join(); + protected: + Thread() : m_joined(false) { } + virtual void * proc() = 0; + private: + pthread_t m_thread; + bool m_joined; + + friend class ThreadHelper; +}; + +template +class Queue { + public: + Queue() { pthread_cond_init(&m_cond, NULL); } + ~Queue() { pthread_cond_destroy(&m_cond); } + void push(T & t) { + m_lock.enter(); + m_queue.push(t); + pthread_cond_signal(&m_cond); + m_lock.leave(); + } + T pop() { + m_lock.enter(); + if (m_queue.size() == 0) + pthread_cond_wait(&m_cond, &m_lock.m_lock); + T t = m_queue.front(); + m_queue.pop(); + m_lock.leave(); + return t; + } + private: + std::queue m_queue; + Lock m_lock; + pthread_cond_t m_cond; }; }; -- cgit v1.2.3