신호 부스트 - 가입자에게 전송 된 객체의 수명을 어떻게 제어합니까? 똑똑한 포인터?

StackOverflow https://stackoverflow.com/questions/2021349

문제

Red Hat Enterprise Linux 5.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 !!!
}

팁이나 방향에 미리 감사드립니다.

-ED

도움이 되었습니까?

해결책

당신이 정말로 통과해야한다면 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;
}

가입자에게 전송 된 공유 매개 변수 개체는 참조 수가 0이되면 자동으로 삭제됩니다 (즉, 모든 핸들러의 범위가 나옵니다).

파라미터가 실제로 너무 헤비급이어서 포인터를 통해 가입자에게 보내야합니까?

편집하다:

shared_ptr을 사용하면 평생 관리를 처리하지만 공유 매개 변수 객체 스레드-세이프에 동시 읽기/쓰기를/쓰는 책임을 완화하지는 않습니다. 스레드 안전 이유만으로 가입자에게 통과하고 싶을 수도 있습니다. 귀하의 질문에 따르면, 스레드 측면에서 진행되는 것이 나에게 충분히 명확하지 않으므로 더 많은 권장 사항을 제공 할 수 없습니다.

스레드 호출입니다 raiseParameterChangedSignal() GUI 스레드와 동일합니까? 일부 GUI 툴킷은 여러 스레드로 API를 동시에 사용하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top