Что было бы хорошим/лучшим для обеспечения безопасности потоков для объектов обратного вызова? В частности, я пытаюсь предотвратить деконструирование объекта обратного вызова, прежде чем все потоки будут завершены с ним.Лучший способ защитить функцию обратного вызова от деконструированных классов
Легко закодировать код клиента для обеспечения безопасности потоков, но я ищу способ, который немного упрощен. Например, использование фабричного объекта для генерации объектов обратного вызова. Проблема заключается в отслеживании использования объекта обратного вызова.
Ниже приведен пример кода, который я пытаюсь улучшить.
class CHandlerCallback
{
public:
CHandlerCallback(){ ... };
virtual ~CHandlerCallback(){ ... };
virtual OnBegin(UINT nTotal){ ... };
virtual OnStep (UINT nIncrmt){ ... };
virtual OnEnd(UINT nErrCode){ ... };
protected:
...
}
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
CHandler* phandler = (CHandler*)lpParameter;
phandler ->ThreadProc();
return 0;
};
class CHandler
{
public:
CHandler(CHandlerCallback * sink = NULL) {
m_pSink = sink;
// Start the server thread. (ThreadProc)
};
~CHandler(){...};
VOID ThreadProc(LPVOID lpParameter) {
... do stuff
if (m_pSink) m_pSink->OnBegin(..)
while (not exit) {
... do stuff
if (m_pSink) m_pSink->OnStep(..)
... do stuff
}
if (m_pSink) m_pSink->OnEnd(..);
};
private:
CHandlerCallback * m_pSink;
}
class CSpecial1Callback: public CHandlerCallback
{
public:
CSpecial1Callback(){ ... };
virtual ~CBaseHandler(){ ... };
virtual OnStep (UINT nIncrmt){ ... };
}
class CSpecial2Callback: public CHandlerCallback...
Тогда код, который управляет всем таким образом, подобный следующему:
int main {
CSpecial2Callback* pCallback = new CSpecial2Callback();
CHandler handler(pCallback);
// Right now the client waits for CHandler to finish before deleting
// pCallback
}
Спасибо!
Я бы также рекомендовал безопасные ссылки с учетом интеллектуальных указателей. Без C++ 11 существуют библиотеки, которые могут предложить это, например. Qt имеет подходящий класс 'QSharedPointer <>', но я думаю, что здесь не вариант. –
Я использую C++ 11, и shared_ptr доступен мне, я полностью забыл об этом. Хотя, я надеялся на решение, которое не зависит от количества ссылок. Но shared_ptr прекрасно справится с этой задачей. Благодаря! – rbhkamal