Multihtread exception safe
:salut: tous
J'étais entrain de rédiger une partie pour http://www.open-std.org/jtc1/sc22/wg...007/n2179.html pour le tuto sur le C++11. Comme je suis pas exception-proof (Qt inside :aie:) je me demandais :
* l'intérêt de ce genre de chose est bien de pouvoir traiter une exception lancée dans un thread dans un autre thread ?
* peut-on le faire sans ça ?
* comment en faisant avant ?
Perso, je traitais l'exception dans le thread qui lance l'exception et en gros, c'est tout (retour erreur ou variable membre error)
Avec la nouvelle norme, on a ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <iostream>
#include <exception>
#include <stdexcept>
#define USE_THREAD_BOOST
#ifdef USE_THREAD_BOOST
#include <boost/thread.hpp>
using boost::thread;
#else
#include <thread>
using std::thread;
#endif
using std::cout;
using std::endl;
struct Task {
void operator() () {
try {
// big work
std::string().at(1);
} catch(...) {
e = std::current_exception(); // on récupère l'exception
}
}
std::exception_ptr e = nullptr;
};
int main ()
{
cout << "Lancement du thread" << endl;
Task tk;
thread th(boost::ref(tk));
th.join();
try {
if (tk.e != nullptr) { // ou : e != std::exception_ptr()
std::rethrow_exception(tk.e); // relance l'exception
}
} catch(const std::exception& e) {
std::cout << "Exception lancée dans le thread : " << e.what() << std::endl;
}
return 0;
} |
Des remarques sur ce code ?
Merci