void fire(AsyncCall func, Args&& ... args) const noexcept(false) { if (empty()) { throw std::runtime_error("nullptr instantiated worker"); } // weak compiler support for expanding parameter pack in a lambda. std::function is the // work-around, With better compiler support it can be changed to: // auto bgCall = [&, args...]{ return (_worker.*func)(args...); }; auto bgCall = std::bind(func, _worker.get(), std::forward<Args>(args)...); _q.push(bgCall); return; }
/** * Clean shutdown. All pending messages are executed before the shutdown message is received */ virtual ~concurrent() { _q.push([ = ] {_done = true;}); if (_thd.joinable()) { _thd.join(); } }
~concurrent() { _q.push([ = ]{_done = true;}); _thd.join(); }