Opened 10 years ago

Last modified 10 years ago

#7541 closed Feature Requests

Add a thread wrapper class that interrupts and join on destruction — at Version 2

Reported by: viboes Owned by: viboes
Milestone: Boost 1.53.0 Component: thread
Version: Boost 1.52.0 Severity: Cosmetic
Keywords: Cc:

Description (last modified by viboes)

Based on the scoped_thread class defined in C++ Concurrency in Action define a thread wrapper class that instead of calling terminate if the thread is joinable on destruction, interrupts and join it if joinable.

While the scoped_thread class defined in C++ Concurrency in Action is a strict scoped class that doesn't allows any change in the wrapped thread, I think that making the interface thread compatible is also a good option. This doesn't means that a strict scoped thread has no use.

namespace boost
{
  class scoped_thread
  {
    thread t;
  public:
    BOOST_THREAD_NO_COPYABLE( scoped_thread)
    explicit scoped_thread(BOOST_THREAD_RV_REF(thread) t_) :
      t(move(t_))
    {
    }
    inline thread::id get_id() const BOOST_NOEXCEPT
    {
      return t.get_id();
    }
    void swap(scoped_thread& x)BOOST_NOEXCEPT
    {
      t.swap(x.t);
    }
    void detach()
    {
      t.detach();
    }
    void join()
    {
      t.join();
    }
    template <class Rep, class Period>
    bool try_join_for(const chrono::duration<Rep, Period>& rel_time)
    {
      return t.try_join_for(rel_time);
    }
    template <class Clock, class Duration>
    bool try_join_until(const chrono::time_point<Clock, Duration>& abs_time)
    {
      return t.try_join_until(abs_time);
    }
    thread::native_handle_type native_handle() BOOST_NOEXCEPT {
      return t.native_handle();
    }
    void interrupt()
    {
      t.interrupt();
    }

    bool interruption_requested() const BOOST_NOEXCEPT
    {
      return t.interruption_requested();
    }
    ~scoped_thread()
    {
      t.interrupt();
      if (t.joinable())
      {
        t.join();
      }
    }
  };
  inline void swap(scoped_thread& lhs,scoped_thread& rhs) BOOST_NOEXCEPT
  {
      return lhs.swap(rhs);
  }
}

Change History (2)

comment:1 by viboes, 10 years ago

Status: newassigned

comment:2 by viboes, 10 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.