Einige Leute scheinen boost :: threads mit der boost :: bind () Funktion zu starten, wie in der akzeptierten Antwort der folgenden Frage:
Boost-Thread und eine nicht statische Klassenfunktion
Während andere Leute es überhaupt nicht verwenden, wie in der Antwort mit den meisten Kommentaren dieser Frage:
Der beste Weg, um eine Thread als Mitglied einer C ++ - Klasse?
Also, was ist der Unterschied, wenn es existiert?
Wie Sie aus dem folgenden Code entnehmen können, der kompiliert und die erwartete Ausgabe liefert, ist boost :: bind völlig überflüssig für die Verwendung von boost :: thread mit freien Funktionen, Member-Funktionen und statischen Member-Funktionen:
%Vor%Ausgabe:
%Vor%Die interne Bindung im Konstruktor erledigt die ganze Arbeit für Sie.
Ich habe nur ein paar zusätzliche Kommentare hinzugefügt, was mit jedem Funktionstyp passiert. (Hoffentlich habe ich die Quelle richtig gelesen!) Soweit ich das sehen kann, wird boost :: bind extern nicht dazu führen, dass es sich verdoppelt und intern aufgerufen wird, da es unverändert durchläuft.
Es gibt keinen Unterschied - thread
contructor verwendet bind
intern.
Leute benutzen bind
explizit aus historischen Gründen, weil Boost.Thread kein " bindender "Konstruktor vor 1.36 .
Das boost::bind
wird verwendet, um eine Memberfunktion an einen Thread zu binden, während Sie ohne boost :: bind normalerweise eine statische Funktion oder eine freie Funktion mit dem Thread verwenden.
Also, was ist der Unterschied, wenn es existiert?
Der Hauptunterschied besteht darin, worauf Sie innerhalb der Thread-Funktion zugreifen müssen.
Wenn Ihr Entwurf erfordert, dass Sie auf die Daten einer Klasseninstanz zugreifen, starten Sie den Thread als Teil einer Klasseninstanz (verwenden Sie boost::bind
mit this
und eine Memberfunktion oder eine statische Memberfunktion mit einem void*
mapped zu this
- das ist meistens eine Frage des Stils).
Wenn Ihr Entwurf erfordert, dass die Thread-Funktion nicht von den Daten eines bestimmten Objekts abhängig ist, verwenden Sie eine freie Funktion.
Der Hauptunterschied besteht darin, ob Sie statische oder nicht statische Elementfunktionen miteinander verbinden möchten. Wenn Sie nicht statische Elementfunktionen als Funktion verwenden möchten, die vom Thread gestartet wird, müssen Sie etwas wie bind
verwenden.
Die vorgeschlagene Alternative (die zweite Frage, die Sie verknüpft haben) besteht darin, eine statische Methode zu verwenden, die einen Zeiger auf das Klassenobjekt annimmt und dann beliebige ihrer Member aufrufen kann. Dies hebt die Syntax etwas auf, aber der größte Vorteil (für mich) ist, dass Sie nicht so etwas wie Boost
hinzufügen müssen, um bind
zu erhalten. Aber wenn Sie boost::threads
verwenden, können Sie auch boost::bind
verwenden. Beachten Sie, dass C ++ 11 std::bind
hat, also könnten Sie bind
auch mit pthreads
verwenden und keine zusätzliche Abhängigkeit wie Boost einführen, aber das ist, wenn Sie C ++ 11 verwenden möchten.
Ich sehe keinen zwingenden Syntaxgrund, um die Verwendung von bind
gegenüber einer statischen Methode, die Memberfunktionen aufruft, zu vermeiden. Aber das ist eher eine Frage der persönlichen Präferenz.
Tags und Links c++ boost boost-thread