Boost logo

Boost Users :

Subject: Re: [Boost-users] [boost::thread] interrupt a future get boost::unknown_exception
From: ÇÇ־ǿ (qiaozhiqiang_at_[hidden])
Date: 2011-03-20 21:27:17


It is only boost::thread

int foo()
{
        this_thread::sleep(seconds(1000));
        return 0;
}

int main(int argc, char** argv)
{
        boost::packaged_task<int> pt(&foo);

        boost::unique_future<int> fi = pt.get_future();
   ..........................
  
>
> ------------------------------
>
> Message: 2
> Date: Fri, 18 Mar 2011 16:43:54 +0100
> From: Viatcheslav.Sysoltsev_at_[hidden]
> To: boost-users_at_[hidden]
> Subject: Re: [Boost-users] [boost::thread] interrupt a future get
> boost::unknown_exception
> Message-ID: <op.vsjpzgww5q4lf0_at_pc-sysolts-zdmf>
> Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes
>
> On Fri, 18 Mar 2011 11:30:11 +0100, ??? <qiaozhiqiang_at_[hidden]>
> wrote:
>
> > [Windows XP, VC++ 10, boost 1.46]
> > When interrupt a future, the future.get() throw boost::unknown_exception,
> > Not boost::thread_interrupted.
> >
> > Class boost::thread_interrupted should have a base class for
> > current_exception_impl() to catch it ? or use BOOST_THROW_EXCEPTION in
> > interruptible_wait) ?
> >
> >
> > ///////////////
> > namespace boost
> > {
> > class thread_interrupted
> > {};
> > }
> >
> >
> > exception_ptr current_exception_impl()
> > {
> > try
> > {
> > throw;
> > }
> > catch(
> > exception_detail::clone_base & e )
> > {
> > return exception_ptr(e.clone());
> > }
> > ................
> > catch(
> > std::exception & e )
> > {
> > return
> > exception_detail::current_exception_unknown_std_exception(e);
> > }
> > catch(
> > boost::exception & e )
> > {
> > return
> > exception_detail::current_exception_unknown_boost_exception(e);
> > }
> > catch(
> > ... )
> > {
> > return
> > exception_detail::current_exception_unknown_exception();
> > }
> >
> >
> > // unknown_exception//////////////////
> > ERROR: Throw in function (unknown)
> > Dynamic exception type: class boost::exception_detail::clone_impl<class
> > boost::unknown_exception>
> > std::exception::what: Unknown exception
> >
> >
> >
> > //code /////////////////////
> > #include <boost/thread.hpp>
> > #include <boost/date_time/posix_time/posix_time_types.hpp>
> > #include <boost/thread/future.hpp>
> > using namespace boost::posix_time;
> > using namespace boost;
> >
> > int main(int argc, char** argv)
> > {
> > boost::packaged_task<int> pt(
> > [=]()->int
> > {
> > this_thread::sleep(seconds(1000));
> > return 0;
> > }
> > );
> > boost::unique_future<int> fi = pt.get_future();
> > boost::thread task(std::move(pt)); // launch task on a thread
> >
> > task.interrupt();
> >
> > try
> > {
> > int v = fi.get();
> > }
> > catch (boost::exception& exc)
> > {
> > std::cerr << "ERROR: " << boost::diagnostic_information(exc) <<
> > std::endl;
> > }
> > }
>
> Wow, boost-1.46 and lambdas, you're really working on the edge. Just to be
> sure it is a boost problem - can you make a classical function instead
> lambda and try with it? The test case seems nearly like one from the
> futures example - I really doubt it is a boost problem.
> I'd be glad to experiment with it yourself but my latest ubuntu has only
> gcc 4.4.5 and the lambdas said to be supported first from 4.5, plus I'd
> need to build 1.46 first, which takes quite a time on my nearly-netbook..
>
> -- Slava
>
>


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net