diff options
Diffstat (limited to 'moses-cmd/src/ThreadPool.h')
-rw-r--r-- | moses-cmd/src/ThreadPool.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/moses-cmd/src/ThreadPool.h b/moses-cmd/src/ThreadPool.h new file mode 100644 index 000000000..eb8ced97f --- /dev/null +++ b/moses-cmd/src/ThreadPool.h @@ -0,0 +1,118 @@ +// $Id: $ + +/*********************************************************************** +Moses - factored phrase-based language decoder +Copyright (C) 2009 University of Edinburgh + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +***********************************************************************/ + +#ifndef moses_cmd_ThreadPool_h +#define moses_cmd_ThreadPool_h + +#include <iostream> +#include <queue> +#include <vector> + + +#include <boost/bind.hpp> +#include <boost/thread.hpp> + +#if defined(BOOST_HAS_PTHREADS) +#include <pthread.h> +#endif + + +#include "Util.h" + + +/** + * Classes to implement a ThreadPool. + **/ + +namespace Moses { + + +/** +* A task to be executed by the ThreadPool +**/ +class Task { + public: + virtual void Run() = 0; + virtual ~Task() {} +}; + +class ThreadPool { + public: + /** + * Construct a thread pool of a fixed size. + **/ + ThreadPool(size_t numThreads); + + + /** + * Add a job to the threadpool. + **/ + void Submit(Task* task); + + /** + * Wait until all queued jobs have completed, and shut down + * the ThreadPool. + **/ + void Stop(bool processRemainingJobs = false); + + ~ThreadPool() { Stop(); } + + + + private: + /** + * The main loop executed by each thread. + **/ + void Execute(); + + std::queue<Task*> m_tasks; + boost::thread_group m_threads; + boost::mutex m_mutex; + boost::condition_variable m_threadNeeded; + boost::condition_variable m_threadAvailable; + bool m_stopped; + bool m_stopping; + +}; + + +class TestTask : public Task { + public: + TestTask(int id) : m_id(id) {} + virtual void Run() { +#if defined(BOOST_HAS_PTHREADS) + int tid = (int)pthread_self(); +#else + int tid = 0; +#endif + std::cerr << "Executing " << m_id << " in thread id " << tid << std::endl; + } + + virtual ~TestTask() {} + + private: + int m_id; +}; + + + +} +#endif |