Warum ist der Destruktor von boost :: thread detaching joinable thread anstatt den Aufruf von terminate () als Standard zu empfehlen?

8

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?

    
mhl666 03.05.2011, 19:17
quelle

1 Antwort

22

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.

    
Howard Hinnant 03.05.2011, 19:29
quelle