Erstellen eines boost :: thread mit boost :: bind () oder ohne es

8

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?

    
deinocheirus 06.12.2012, 11:26
quelle

5 Antworten

9

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.

    
goji 06.12.2012, 11:39
quelle
7

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 .

    
Igor R. 06.12.2012 12:42
quelle
1

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.

    
Tony The Lion 06.12.2012 11:32
quelle
1
  

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.

    
utnapistim 06.12.2012 12:28
quelle
0

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.

    
tpg2114 06.12.2012 11:32
quelle

Tags und Links