78 template <
class F,
class... Args>
auto enqueue(F&& f, Args&&... args) -> std::future<
typename std::result_of<F(Args...)>::type> {
79 using return_type =
typename std::result_of<F(Args...)>::type;
80 auto task = std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
82 std::future<return_type> res = task->get_future();
84 std::unique_lock<std::mutex> lock(mutex_);
85 tasks_.emplace([task]() { (*task)(); });
87 condition_.notify_one();
116 ready.store(
true, std::memory_order_release);
118 std::unique_lock<std::mutex> lock(mutex_);
119 while(tasks_.empty() && ready.load(std::memory_order_acquire)) {
120 condition_.wait_for(lock, std::chrono::milliseconds(10));
124 ready.store(
false, std::memory_order_release);