Thread save Queue
-
C_++std-2017 schrieb:
eine exception geworfen
Eine?
-
Vielleicht besser gesagt 4
-
Glaubst du wirklich, dass ich nach der Anzahl gefragt habe?
-
Hi,
eine? Kann man falsch verstehen und habe ich auch falsch verstanden, sorry.T pop(){ try { boost::unique_lock<boost::mutex> mlock(mutex); while (queue.empty()) { cond.wait(mlock); } } catch (boost::exception & e) { std::cout << "Errror111111111\n" << "\n"; } catch (const std::runtime_error& re) { std::cerr << "Runtime error: " << re.what() << std::endl; } catch (const std::exception& ex) { std::cerr << "Error occurred: " << ex.what() << std::endl; } catch (...) { std::cout << "Errror222222222222222\n" << "\n"; } try { auto val = queue.front(); queue.pop(); return val; } catch (...) { std::cout << "FERRRRRRR\n"; } throw; }
Habe die Pop Methode um Catches erweitert kriege allerdings nur Error2222222 raus, deshalb kann ich nicht sagen was für eine Exception geworfen wird
-
Kann mir einer helfen, zumindest die exception zu fangen damit ich weiß was passiert?
-
Neuer Code, neues Glück.
In Zeile 7 wird dein Mutex freigegeben. Das war's dann mit threadsafe.
-
Hi Leute,
danke erstmal für die Hilfe.
Die Klasse ist Thread Safe!Problem ist wenn ein weitere Thread die Konsumenten mit Interrupt beenden, kommt es zur exception!
-
C_++std-2017 schrieb:
Problem ist wenn ein weitere Thread die Konsumenten mit Interrupt beenden, [...]
Was im normalen Programmablauf niemals passieren sollte...
-
C_++std-2017 schrieb:
Problem ist wenn ein weitere Thread die Konsumenten mit Interrupt beenden, kommt es zur exception!
Das ist kein Problem, das ist das definierte Verhalten von
boost::thread::interrupt()
: Es führt dazu dass im unterbrochenen Thread eineboost::thread_interrupted
Exception geworfen wird.
Und daboost::thread_interrupted
nicht vonstd::exception
abgeleitet ist (und auch sonst keine Basisklassen hat), landet die halt imcatch (...).
=> Es ist immer von Vorteil wenn man weiss was die Klassen/Funktionen die man verwendet so machen.
-
Richtig! Allerdings wäre mir nicht in den Sinn gekommen in der Queue diese Exception zu fangen. Aber man lernt aus Fehlern
-
Brauchst du ja nicht.
Die boost::thread_interrupted Exception darf eh aus der Thread-Function rauspfeiffen. Wenn boost::thread eine boost::thread_interrupted Exception fängt, wird der Thread einfach nur beendet. Bei allen anderen Exceptions wird AFAIK das Programm abgebrochen (vermutlich über einen Aufruf von abort, terminate oder unexpected).ps: Wobei natürlich VIEL besser ist einfach
boost::thread::interrupt()
nicht zu verwenden.