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;
24 std::deque<job_t> _queue;
26 boost::thread_group pool;
28 boost::atomic_bool shutdown;
31 while (boost::optional<job_t> job = q.
dequeue())
39 for (
unsigned i = 0;
i < boost::thread::hardware_concurrency(); ++
i)
40 pool.create_thread(boost::bind(worker_thread, boost::ref(*
this)));
46 if (maxThreads > boost::thread::hardware_concurrency() || maxThreads == 0)
47 maxThreads = boost::thread::hardware_concurrency();
48 for (
unsigned i = 0;
i < maxThreads; ++
i)
49 pool.create_thread(boost::bind(worker_thread, boost::ref(*
this)));
54 boost::lock_guard<boost::mutex> lk(mx);
55 _queue.push_back(job);
61 boost::unique_lock<boost::mutex> lk(mx);
62 namespace phx = boost::phoenix;
63 cv.wait(lk, phx::ref(shutdown) || !phx::empty(phx::ref(_queue)));
66 job_t job = _queue.front();
76 boost::lock_guard<boost::mutex> lk(mx);
86 boost::lock_guard<boost::mutex> lk(mx);
PndLmdThreadPool(unsigned int maxThreads)
boost::optional< job_t > dequeue()