11 #include <boost/thread.hpp>
12 #include <boost/phoenix.hpp>
13 #include <boost/optional.hpp>
21 boost::condition_variable
cv;
23 typedef boost::function<void()>
job_t;
30 while (boost::optional<job_t> job = q.
dequeue())
38 for (
unsigned i = 0;
i < boost::thread::hardware_concurrency(); ++
i)
39 pool.create_thread(boost::bind(worker_thread, boost::ref(*
this)));
45 if (maxThreads > boost::thread::hardware_concurrency() || maxThreads == 0) maxThreads =
46 boost::thread::hardware_concurrency();
47 for (
unsigned i = 0;
i < maxThreads; ++
i)
48 pool.create_thread(boost::bind(worker_thread, boost::ref(*
this)));
52 boost::lock_guard<boost::mutex> lk(mx);
53 _queue.push_back(job);
58 boost::unique_lock<boost::mutex> lk(mx);
59 namespace phx = boost::phoenix;
60 cv.wait(lk, phx::ref(shutdown) || !phx::empty(phx::ref(_queue)));
61 if (_queue.empty())
return boost::none;
62 job_t job = _queue.front();
71 boost::lock_guard<boost::mutex> lk(mx);
80 boost::lock_guard<boost::mutex> lk(mx);
std::deque< job_t > _queue
boost::condition_variable cv
PndLmdThreadPool(unsigned int maxThreads)
static void worker_thread(PndLmdThreadPool &q)
boost::optional< job_t > dequeue()
boost::atomic_bool shutdown
boost::function< void()> job_t