Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
1.9KB

  1. //
  2. // detail/thread_group.hpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #ifndef ASIO_DETAIL_THREAD_GROUP_HPP
  11. #define ASIO_DETAIL_THREAD_GROUP_HPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include "asio/detail/config.hpp"
  16. #include "asio/detail/scoped_ptr.hpp"
  17. #include "asio/detail/thread.hpp"
  18. namespace asio {
  19. namespace detail {
  20. class thread_group
  21. {
  22. public:
  23. // Constructor initialises an empty thread group.
  24. thread_group()
  25. : first_(0)
  26. {
  27. }
  28. // Destructor joins any remaining threads in the group.
  29. ~thread_group()
  30. {
  31. join();
  32. }
  33. // Create a new thread in the group.
  34. template <typename Function>
  35. void create_thread(Function f)
  36. {
  37. first_ = new item(f, first_);
  38. }
  39. // Create new threads in the group.
  40. template <typename Function>
  41. void create_threads(Function f, std::size_t num_threads)
  42. {
  43. for (std::size_t i = 0; i < num_threads; ++i)
  44. create_thread(f);
  45. }
  46. // Wait for all threads in the group to exit.
  47. void join()
  48. {
  49. while (first_)
  50. {
  51. first_->thread_.join();
  52. item* tmp = first_;
  53. first_ = first_->next_;
  54. delete tmp;
  55. }
  56. }
  57. // Test whether the group is empty.
  58. bool empty() const
  59. {
  60. return first_ == 0;
  61. }
  62. private:
  63. // Structure used to track a single thread in the group.
  64. struct item
  65. {
  66. template <typename Function>
  67. explicit item(Function f, item* next)
  68. : thread_(f),
  69. next_(next)
  70. {
  71. }
  72. asio::detail::thread thread_;
  73. item* next_;
  74. };
  75. // The first thread in the group.
  76. item* first_;
  77. };
  78. } // namespace detail
  79. } // namespace asio
  80. #endif // ASIO_DETAIL_THREAD_GROUP_HPP