2010-03-09 6 views
9

Ich habe eine Liste von Elementen, die ich in verschiedenen Intervallen aktualisieren muss. Die Liste kann Tausende von Artikeln lang werden. Jeder Artikel könnte möglicherweise ein anderes Intervall haben. Wenn ich einen Timer pro Artikel erstelle, werde ich das System mit Threads sättigen? Ich dachte, es wäre besser, einen Timer zu erstellen, der dem kleinsten Intervall in der Menge von Elementen entspricht, und dann bei jedem Update einen Zähler zu erhöhen und dann zu prüfen, ob der Zähler nun gleich anderen Intervallen ist. Dies sollte funktionieren, vorausgesetzt, das kleinste Intervall ist ein Vielfaches aller anderen Intervalle. Irgendwelche Vorschläge?Verwendet boost :: asio :: deadline_timer einen Thread für jeden Timer?

Antwort

12

Boost verwendet keinen Thread pro Zeitgeber, er behält eine Timer-Warteschlange. Jeder Timer wird mit boost::asio::io_service Objekt erstellt, das die eigentliche Arbeit erledigt.

Dieses Objekt kann seine Arbeit in einem oder mehreren Threads senden, when you run boost::asio::io_service::run() explicitly from multiple threads, aber es gibt keine Eins-zu-Eins-Korrespondenz zwischen Timern und Threads, und Asio erstellt keine Threads hinter Ihrem Rücken.

+0

Ok das ist gut, aber Sie sagen, es wird seine Arbeit in "einem oder mehreren" Threads versenden. Wenn ich eintausend Timer an einen io_service gebunden habe und einen Aufruf über den io_service von einem Thread aus starte, werden all diese Timer für einen neuen Thread ausgeführt? Offensichtlich werden sie nicht auf dem aufrufenden Thread ausgeführt, wenn Sie timer :: async_wait aufrufen, richtig? Trotz dieser Fähigkeit scheint mein Design, wie gesagt, vorzuziehen, viele Timer zu erstellen? Oder impliziere ich im Grunde, was der Timer ohnehin macht? – Rhubarb

+6

(1) Ja, wenn Sie einen IO-Dienst von Thread A ausführen, werden alle Timer-Handler auf Thread A ausgeführt. (2) Es wird empfohlen, viele Timer zu erstellen, da diese wartungsfreundlicher und weniger fehleranfällig als die manuelle Berechnung sind Intervall für einen Timer (du hättest 1-zu-1-Relation s/w-Workitems und -Timer). –

+2

PS Und ja, du würdest Arbeiten duplizieren, die Asio bereits für dich erledigt (den frühesten auslaufenden Timer im Auge behaltend). –

1

Recent versions von Asio, Boost 1.43 und höher, verwenden Sie die timerfd_create(2) API unter Linux für deadline_timer s.

Geändert, um timerfd für das Senden von Timern unter Linux zu verwenden, wenn verfügbar ist.