| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | //// detail/thread_group.hpp// ~~~~~~~~~~~~~~~~~~~~~~~//// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)//// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//#ifndef BOOST_ASIO_DETAIL_THREAD_GROUP_HPP#define BOOST_ASIO_DETAIL_THREAD_GROUP_HPP#if defined(_MSC_VER) && (_MSC_VER >= 1200)# pragma once#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)#include <boost/asio/detail/config.hpp>#include <boost/asio/detail/scoped_ptr.hpp>#include <boost/asio/detail/thread.hpp>namespace boost {namespace asio {namespace detail {class thread_group{public:  // Constructor initialises an empty thread group.  thread_group()    : first_(0)  {  }  // Destructor joins any remaining threads in the group.  ~thread_group()  {    join();  }  // Create a new thread in the group.  template <typename Function>  void create_thread(Function f)  {    first_ = new item(f, first_);  }  // Create new threads in the group.  template <typename Function>  void create_threads(Function f, std::size_t num_threads)  {    for (std::size_t i = 0; i < num_threads; ++i)      create_thread(f);  }  // Wait for all threads in the group to exit.  void join()  {    while (first_)    {      first_->thread_.join();      item* tmp = first_;      first_ = first_->next_;      delete tmp;    }  }  // Test whether the group is empty.  bool empty() const  {    return first_ == 0;  }private:  // Structure used to track a single thread in the group.  struct item  {    template <typename Function>    explicit item(Function f, item* next)      : thread_(f),        next_(next)    {    }    boost::asio::detail::thread thread_;    item* next_;  };  // The first thread in the group.  item* first_;};} // namespace detail} // namespace asio} // namespace boost#endif // BOOST_ASIO_DETAIL_THREAD_GROUP_HPP
 |