Gemäß dem C ++ 0x-Standardentwurf lautet dieser Code:
%Vor%... sollte zu einem Aufruf von terminate () führen, aber in der aktuellen (Boost 1.46.1) Implementierung von Boost-Threads nicht, wird der Thread einfach in destructor losgelöst und geht weiter.
Meine Frage ist: warum?
Ich dachte boost :: thread ist so sehr mit dem Standardentwurf inline, wie es geht.
Gibt es dafür einen Design-Grund? Wird es in zukünftigen Versionen von boost :: thread geändert?
Der Grund ist weitgehend historisch. boost::thread
kam zuerst. Die Vorschläge für std::thread
wurden von boost::thread
abgeleitet und hatten ursprünglich das Verhalten, das boost::thread
jetzt hat.
Während des Standardisierungsprozesses wollte jedoch eine signifikante Anzahl von Leuten std::thread::~thread()
bis join()
im Destruktor, wenn sie nicht schon verbunden waren, anstatt detach()
. Die Argumente wurden für jede Seite abgegeben und die Stimmen wurden abgegeben. 50/50. Es wurden mehr Argumente vorgebracht und mehr Stimmen abgegeben. Einige Leute wurden in die andere Position gebracht. Aber immer noch 50/50.
Jemand (ich kann mich nicht erinnern, wer) hat terminate()
vorgeschlagen. Es wurden Stimmen abgegeben, und obwohl es nicht einstimmig war (ich konnte nicht dafür stimmen), erhielt es eine ausreichende Mehrheit, um als Konsens bezeichnet zu werden.
Ich stelle mir vor, dass boost::thread
sich nie geändert hat, weil es eine installierte Benutzerbasis hatte und niemand den Code für diese Benutzerbasis unnötig brechen wollte.
Bearbeiten:
Ah, Rob weist uns auf das Original dieser doppelten Frage hin Antwort zeigt auf N2802 , die Begründung enthält.
Ich sollte auch beachten, dass der ursprüngliche Vorschlag für std::thread
eine Thread-Löschung hatte und ~ thread () den nicht verbundenen Thread abbrach und ihn dann löste, was sehr sinnvoll war. Dieser Codepfad wird normalerweise nur ausgewählt, wenn der übergeordnete Thread aufgrund einer Ausnahme abgewickelt wurde.
Tags und Links c++ multithreading c++11 standards-compliance boost-thread