Frage

Ich bin mit boost :: signals2 unter Red Hat Enterprise Linux 5.3.

Mein Signal erzeugt ein Objekt kopieren und sendet es Zeiger an die Abonnenten. Dies wurde für die Thread-Sicherheit implementiert, um den Arbeitsthread zu verhindern, dass eine String-Eigenschaft auf dem Objekt in der gleichen Zeit zu aktualisieren sie gelesen werden (vielleicht soll ich die Verwendung von Sperren erneut?).

Wie auch immer, meine Sorge ist, mit mehreren Teilnehmern, dass dereferenzieren den Zeiger auf das kopierte Objekt auf ihren eigenen Thread. Wie kann ich Objektlebensdauer zu kontrollieren? Wie kann ich weiß alle Teilnehmer mit dem Objekt fertig sind und es ist sicher, das Objekt zu löschen?

typedef boost::signals2::signal< void ( Parameter* ) > signalParameterChanged_t;
signalParameterChanged_t    m_signalParameterChanged;

// Worker Thread - Raises the signal
void Parameter::raiseParameterChangedSignal()
{
      Parameter* pParameterDeepCopied = new Parameter(*this);
      m_signalParameterChanged(pParameterDeepCopied);
}
// Read-Only Subscriber Thread(s) - GUI (and Event Logging thread ) handles signal
void ClientGui::onDeviceParameterChangedHandler( Parameter* pParameter)
{
      cout << pParameter->toString() << endl;
      delete pParameter;  // **** This only works for a single subscriber !!!
}

Vielen Dank im Voraus für alle Tipps oder Richtung,

-Ed

War es hilfreich?

Lösung

Wenn Sie wirklich Parameter durch Zeiger auf Ihre Abonnenten passieren müssen, dann sollten Sie boost::shared_ptr verwenden:

typedef boost::shared_ptr<Parameter> SharedParameterPtr;
typedef boost::signals2::signal< void ( SharedParameterPtr ) > signalParameterChanged_t;
signalParameterChanged_t    m_signalParameterChanged;

// The signal source
void Parameter::raiseParameterChangedSignal()
{
      SharedParameterPtr pParameterDeepCopied = new Parameter(*this);
      m_signalParameterChanged(pParameterDeepCopied);
}
// The subscriber's handler
void ClientGui::onDeviceParameterChangedHandler( SharedParameterPtr pParameter)
{
      cout << pParameter->toString() << endl;
}

Das gemeinsame Parameterobjekt an Ihre Abonnenten gesendet werden automatisch gelöscht, wenn der Referenzzähler Null wird (das heißt es aus dem Geltungsbereich in allen Handler).

Ist Parameter wirklich so schwergewichtig, dass Sie es an Ihre Abonnenten über Zeiger senden müssen?

EDIT:

Bitte beachten Sie, dass shared_ptr mit nimmt Lebensdauer-Management, aber Sie werden von der Verantwortung nicht entlasten machen gleichzeitige Lesen / Schreiben von / aus dem gemeinsamen Parameterobjekt Thread-sicher. Sie können auch allein für faden aus Sicherheitsgründen an Ihre Abonnenten Pass-by-Kopie anfertigen möchten. In Ihrer Frage, es ist mir nicht klar genug, was auf gewinde weise geht, so kann ich Ihnen mehr spezifische Empfehlungen nicht geben.

Ist der Thread das gleiche wie Ihr GUI-Thread ruft raiseParameterChangedSignal()? Einige GUI-Toolkits erlauben keine gleichzeitige Nutzung ihrer API von mehreren Threads.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top