#include <iostream> #include <vector> #include <thread> #include <string> #include <chrono> #include <random> #include <condition_variable> #include <boost/asio.hpp> struct worker_pool { boost::asio::io_service _io_service; boost::asio::io_service::work _work { _io_service }; std::vector<std::thread> _threads; std::condition_variable _cv; std::mutex _cvm; size_t _tasks = 0; void start() { for (int i = 0 ; i < 8 ; ++i) { _threads.emplace_back(std::bind(&worker_pool::thread_proc, this)); } } void wait() { std::unique_lock<std::mutex> lock(_cvm); _cv.wait(lock, [this] { return _tasks == 0; }); } void stop() { wait(); _io_service.stop(); for (auto& t : _threads) { if (t.joinable()) t.join(); } _threads.clear(); } void thread_proc() { while (!_io_service.stopped()) { _io_service.run(); } } void reduce() { std::unique_lock<std::mutex> lock(_cvm); if (--_tasks == 0) { lock.unlock(); _cv.notify_all(); } } template<class F> void submit(F&& f) { std::unique_lock<std::mutex> lock(_cvm); ++ _tasks; lock.unlock(); _io_service.post([this, f = std::forward<F>(f)] { f(); reduce(); }); } }; struct some_other_work { some_other_work(int index, std::chrono::milliseconds delay) : _index(index), _delay(delay) {} void operator()() const { std::this_thread::sleep_for(_delay); printf( "I am worker: %d\n", _index); } int _index; std::chrono::milliseconds _delay; }; auto main() -> int { worker_pool pool; pool.start(); for (int i = 0 ; i < 100 ; ++i) { std::chrono::milliseconds delay(500); pool.submit(some_other_work(i, delay)); } pool.wait(); pool.stop(); return 0; }
Standard input is empty
/home/7Jhm7a/ccGu6O2h.o: In function `boost::asio::detail::task_io_service::shutdown_service()': prog.cpp:(.text._ZN5boost4asio6detail15task_io_service16shutdown_serviceEv[_ZN5boost4asio6detail15task_io_service16shutdown_serviceEv]+0x6c): undefined reference to `boost::system::system_category()' /home/7Jhm7a/ccGu6O2h.o: In function `boost::asio::detail::task_io_service::~task_io_service()': prog.cpp:(.text._ZN5boost4asio6detail15task_io_serviceD2Ev[_ZN5boost4asio6detail15task_io_serviceD5Ev]+0x32): undefined reference to `boost::system::system_category()' /home/7Jhm7a/ccGu6O2h.o: In function `boost::asio::detail::task_io_service::~task_io_service()': prog.cpp:(.text._ZN5boost4asio6detail15task_io_serviceD0Ev[_ZN5boost4asio6detail15task_io_serviceD5Ev]+0x32): undefined reference to `boost::system::system_category()' /home/7Jhm7a/ccGu6O2h.o: In function `boost::asio::detail::task_io_service_thread_info::~task_io_service_thread_info()': prog.cpp:(.text._ZN5boost4asio6detail27task_io_service_thread_infoD2Ev[_ZN5boost4asio6detail27task_io_service_thread_infoD5Ev]+0x32): undefined reference to `boost::system::system_category()' /home/7Jhm7a/ccGu6O2h.o: In function `worker_pool::thread_proc()': prog.cpp:(.text._ZN11worker_pool11thread_procEv[_ZN11worker_pool11thread_procEv]+0x45): undefined reference to `boost::system::system_category()' /home/7Jhm7a/ccGu6O2h.o:prog.cpp:(.text._ZN11worker_pool11thread_procEv[_ZN11worker_pool11thread_procEv]+0x56): more undefined references to `boost::system::system_category()' follow /home/7Jhm7a/ccGu6O2h.o: In function `_GLOBAL__sub_I_main': prog.cpp:(.text.startup+0x695): undefined reference to `boost::system::generic_category()' prog.cpp:(.text.startup+0x69a): undefined reference to `boost::system::generic_category()' prog.cpp:(.text.startup+0x69f): undefined reference to `boost::system::system_category()' prog.cpp:(.text.startup+0x6a4): undefined reference to `boost::system::system_category()' collect2: error: ld returned 1 exit status
Standard output is empty