boost::asio::io_service::strand
-
Huhu,
Welchen Zweck hat das Ding eigentlich? Wenn ich meine Handler damit wrappe, wird mir ja garantiert, dass sie nicht parallel aufgerufen werden. Damit verfehlt man doch den Zweck mehrerer Threads. Wozu das Ganze?
Grüße,
PI
-
Oftmals ist es nicht nötig, dass die Hander gleichzeitig aufgerufen werden. Gewartet auf Ereignisse oder Empfangen von Daten geschieht ja trotz strand paralell - nur die Aufrufe der Completion-Handlern nicht.
EDIT:
Noch als Anmerkung: Man spart sich zusätzliche Synchronisation.
-
Parallel warten kann ich doch aber genauso mit select().
-
314159265358979 schrieb:
Parallel warten kann ich doch aber genauso mit select().
Ja, und? Das hat mit strand aber nichts zu tun.
-
Ja, eben. Deshalb brauche ich strand auch nicht. Anstatt mit mehreren Threads zu warten, nehme ich select() und nur einen Thread. Dazu brauche ich kein strand.
-
314159265358979 schrieb:
Ja, eben. Deshalb brauche ich strand auch nicht.
Hat die Dokumentation etwa behauptet, du bräuchtest das?
Man kannio_serviceübrigens auch sehr gut mit nur einem Thread verwenden.
-
314159265358979 schrieb:
Ja, eben. Deshalb brauche ich strand auch nicht. Anstatt mit mehreren Threads zu warten, nehme ich select() und nur einen Thread. Dazu brauche ich kein strand.
select(..) wird unter anderen Mechanismen auch in Teilen von boost::asio verwendet, jedoch ist das ein Implementationsdetail.
Deine Aussage mal auf boost::asio gemappt:
Wenn nur ein Thread boost::asio::io_service::run() aufruft, brauche ich kein strand, weil alle Handler auf diesem einen Thread aufgerufen werden.Das gilt natürlich bei mehreren Threads die run() aufrufen nicht mehr - dann kann man eben strand verwenden.
-
Ihr versteht nicht worauf ich hinaus will - Anstatt mehrere Threads zu verwenden und mit strand zu wrappen, kann ich gleich direkt nur einen Verwenden. boost::asio wird dennoch intern select, oder eben das Plattform-abhängige Pendant verwenden. Es macht 0 Unterschied... Demnach ist die Klasse zwecklos.
-
314159265358979 schrieb:
Ihr versteht nicht worauf ich hinaus will - Anstatt mehrere Threads zu verwenden und mit strand zu wrappen, kann ich gleich direkt nur einen Verwenden. boost::asio wird dennoch intern select, oder eben das Plattform-abhängige Pendant verwenden. Es macht 0 Unterschied... Demnach ist die Klasse zwecklos.
strand ist mit einem Thread "sinnlos" - aber nicht mit mehreren Threads. strand ist für den Umstand mit den mehreren Threads.
-
Welcher Umstand? Es macht keinen Unterschied, ob 1 Thread oder mehrere + strand. Es kommt aufs selbe raus.
-
314159265358979 schrieb:
Es kommt aufs selbe raus.
Denkst du!
-
Weiß ich.
-
Ich sage ja auch nichts anderes.

EDIT:
Ich muss präzisieren:
Es macht keinen Unterschied im Bezug auf wiviele Threads gleichzeitig die Handler aufrufen. (1 Thread vs. n Threads + strand)
-
Na welchen Zweck hat das Ding dann?
-
314159265358979 schrieb:
Na welchen Zweck hat das Ding dann?
Na eben: FALLS man mehrere Threads hat UND man möchte, dass die Handler jeweils nur auf einem Thread zur gleichen Zeit aufgerufen werden.
-
Das möchte man aber nicht, weil es sinnlos ist und nur Overhead bringt.
-
warum? der server wird doch schneller wenn mehrere threads die run metthode aufrufen
-
Nö. Das kommt aufs selbe raus, als wenn ich immer abwechselnd mit einem Thread warte und bearbeite.
-
wie du meinst.
-
Wie wäre es, wenn du Handler hast, die synchronisiert werden müssen (da Zugriff auf gemeinsame Resourcen)? Wenn sich z.B. bei deinem IRC-Server ein Client connected und das threadübergreifende Clientarray modifiziert werden soll, möchte das schon synchronisiert sein. Da kannst du entweder einen Mutex nehmen, oder eben einen Strand. Andere Handler, z.B. Empfang einer Nachricht, können möglicherweise parallel ablaufen, da nimmst du den Strand nicht.
-
theta schrieb:
wie du meinst.
Theta, lass ihn.

Er ist zu dumm oder/und ignorant um es zu verstehen.Du hast schon mehrmals erwähnt wozu strand gut ist. Anscheinend, hat er noch nie mit Threads und kritischen Bereichen gearbeitet.