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 )
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 , 10 years ago
| Status: | new → assigned |
|---|
comment:2 by , 10 years ago
| Description: | modified (diff) |
|---|
Note:
See TracTickets
for help on using tickets.
