3

Red Hat EnterpriseLinux5.3でboost::signals2を使用しています。

私のシグナルはオブジェクトコピーを作成し、そのポインターをサブスクライバーに送信します。これは、スレッドの安全性のために実装され、ワー​​カースレッドがオブジェクトの読み取りと同時にオブジェクトの文字列プロパティを更新するのを防ぎます(おそらく、ロックの使用を再検討する必要がありますか?)。

とにかく、私の懸念は、自分のスレッドでコピーされたオブジェクトへのポインターを逆参照する複数のサブスクライバーにあります。オブジェクトの有効期間を制御するにはどうすればよいですか?すべてのサブスクライバーがオブジェクトを処理し、オブジェクトを安全に削除できることをどのように知ることができますか?

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 !!!
}

ヒントや方向性を事前に感謝します、

-エド

4

1 に答える 1

2

Parameterサブスクライバへのポインタ渡しが本当に必要な場合は、次を使用する必要がありますboost::shared_ptr

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;
}

サブスクライバーに送信された共有パラメーター オブジェクトは、その参照カウントがゼロになると (つまり、すべてのハンドラーで範囲外になると)、自動的に削除されます。

パラメーターは、ポインターを介してサブスクライバーに送信する必要があるほど重いですか?

編集:

shared_ptr を使用すると、有効期間の管理が行われますが、共有パラメーター オブジェクトへの/からの同時読み取り/書き込みをスレッドセーフにする責任が軽減されるわけではないことに注意してください。スレッドセーフの理由だけで、サブスクライバーにコピーごとに渡したい場合があります。あなたの質問では、スレッドごとに何が起こっているのかが十分に明確ではないため、より具体的な推奨事項を提供することはできません.

呼び出しraiseParameterChangedSignal()ているスレッドは GUI スレッドと同じですか? 一部の GUI ツールキットでは、複数のスレッドによる API の同時使用が許可されていません。

于 2010-01-10T22:04:57.087 に答える