From Anthony William's "C++ concurrency in action - practical multithreading", section 1.4.1 gives a simple "Hello world" program using C++11's thread.
#include <iostream>
#include <thread>
void hello()
{
std::cout <<"Hello concurrent world!\n";
}
int main()
{
std::thread t(hello);
t.join();
}
After Matthew Wilson re-starting his series in Overload, "Quality Matters #7 Exceptions: the story so far" http://accu.org/var/ uploads/journals/Overload114. pdf page 10ff, I had a nagging feeling I should put some exception handling round this.
First question, what happens if we make the hello throw an exception? For example, what would this do?
std::thread t_trouble( []{ throw std::exception("Oops");} );
It calls abort. The thread function mustn't let exceptions escape. Also, main should probably catch some exceptions; for example, maybe there aren't enough resources to start the thread yet.
#include <iostream>
#include <thread>
void hello()
{
try
{
std::cout <<"Hello concurrent world!\n";
}
catch(const std::exception& e)
{
//erm... what to do with it?
}
}
int main()
{
try
{
std::thread t(hello);//can I pass parameters? Nico says I can to async (page 964)
t.join(); //Nico says we can do a t.detach and when main exits it will get stopped
}
catch(const std::system_error& e) //pulled in by thread I presume
{
if(e.code() == std::errc::resource_ unavailable_try_again)
{
std::cout << "Try again\n";
}
}
catch(const std::exception& e)
{
std::cout << e.what() << '\n';
}
}
Right, so now we are ignoring any exceptions that get thrown.
What should I do with any exceptions I get in a function that's sent to a thread? I could use std::exception_ptr, and std::rethrow_exception when a client tries to get the result. It might be better if I read all of Anthony's book (esp Chapter 8) and use std::packaged_task instead.
accu-general (http://accu.org/index.php/mailinglists) helpfully told me to read all the chapters in the book concurrently.
No comments:
Post a Comment