2009-12-01 8 views
9

Ich habe an mehreren Stellen gelesen, dass Boost.Signals nicht threadsicher ist, aber ich habe nicht viel mehr Details darüber gefunden. Dieses einfache Zitat sagt nicht wirklich viel. Die meisten Anwendungen haben heutzutage Threads - auch wenn sie versuchen, Single-Threading zu sein, können einige ihrer Bibliotheken Threads verwenden (zum Beispiel libsdl).Boost: Was genau ist in Boost.Signals nicht threadsafe?

Ich denke, die Implementierung hat keine Probleme mit anderen Threads, die nicht auf den Steckplatz zugreifen. So ist es zumindest threadsicher in diesem Sinne.

Aber was genau funktioniert und was würde nicht funktionieren? Würde es funktionieren, es aus mehreren Threads zu verwenden, solange ich nicht gleichzeitig darauf zugreife? I.e. wenn ich meine eigenen Mutexe um den Schlitz herum baue?

Oder bin ich gezwungen, den Slot nur in dem Thread zu verwenden, in dem ich ihn erstellt habe? Oder wo ich es zum ersten Mal benutzt habe?

+0

Es ist schon eine Weile her ... hat meine Antwort Sinn ergeben? Im Grunde wird die Signalbibliothek * selbst * nicht abstürzen, unabhängig von den Aufrufen, die Sie aus irgendwelchen Threads machen, solange sie "gültig" sind ... aber Sie sind verantwortlich für die Semantik in Ihrem eigenen Code. – HostileFork

+0

Ja, es macht Sinn, aber es beantwortet nicht wirklich alle meine Fragen. :) Grundsätzlich hast du gesagt "schau es dir in der Quelle an". Ich werde das zu einem späteren Zeitpunkt tun und dann alle exakten Antworten auf meine Fragen hier posten. – Albert

+0

Sie haben gefragt "Was genau funktioniert und was nicht funktioniert?" Ich fühlte, dass das wichtiger war, als Ihre engeren spezifischen Fragen zu analysieren.(Diese Antworten sind "Ja: Wenn Sie mit einem Mutex hüten, ist das in Ordnung, aber möglicherweise unnötig, wenn die Semantik Ihrer Slots so ist, dass mehr als ein Thread sie gleichzeitig ausführen kann; es ist wie eine andere Funktion aus mehreren Threads aufzurufen") und "Nein: Sie sind nicht darauf beschränkt, Slots nur in den Threads zu verwenden, in denen sie erstellt werden." – HostileFork

Antwort

5

Ich glaube nicht, es entweder zu klar ist, und einer der Bibliothek Rezensenten said here:

mir auch die Tatsache nicht gefällt, dass nur dreimal das Wort ‚Faden‘ genannt wurde. Boost.signals2 möchte eine 'thread safe signals' Bibliothek sein. Deshalb einige mehr Details und besonders mehr Beispiele, die auf diesem Gebiet betreffen, sollten dem Benutzer gegeben werden.

Eine Möglichkeit, herauszufinden, ist go to the source und sehen, was sie verwenden _mutex/lock() zu schützen. Dann stell dir vor, was passieren würde, wenn diese Anrufe nicht da wären. :)

Von dem, was ich sammeln kann, ist es einfache Dinge wie "wenn ein Thread verbindet oder trennt, das wird nicht einen anderen Thread, der durch die Schlitze dieser Signale zum Absturz führt iterieren". So wie die Verwendung einer Thread-sicheren Version der C-Laufzeitbibliothek sicherstellt, dass zwei Threads, die gleichzeitig gültige Aufrufe an printf ausführen, keinen Absturz verursachen. (nicht die Ausgabe zu sagen, werden Sie keinen Sinn bekommen — Sie für die höhere Ordnung Semantik noch verantwortlich sind.)

Es scheint nicht, wie Qt zu sein, in dem der Faden ein bestimmter Slot des Code läuft auf basiert auf der "thread affinity" des Ziel-Slots (was bedeutet, dass das Aussenden eines Signals Slots auf vielen verschiedenen Threads auslösen kann, um parallel zu laufen.) Aber ich unterstütze das nicht, deshalb können die boost :: signal "combiners" do things like this.

0

Ein Problem, das ich sehe, ist, dass ein Thread verbinden oder trennen kann, während ein anderer Thread signalisiert.

Sie können Ihr Signal leicht wickeln und Anrufe mit Mutex verbinden. Es ist jedoch nicht trivial, die Verbindungen zu umbrechen. (connect gibt Verbindungen zurück, mit denen Sie die Verbindung trennen können).