Boost logo

Boost Users :

Subject: Re: [Boost-users] [boost::thread] interrupt a future get boost::unknown_exception
From: Viatcheslav.Sysoltsev_at_[hidden]
Date: 2011-03-18 11:43:54


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