У меня есть объект (клиент * клиент), который запускает несколько потоков для обработки различных задач (таких как обработка входящих данных). Потоки запускаются так:
// Start the thread that will process incoming messages and stuff them into the appropriate queues.
mReceiveMessageThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)receiveRtpMessageFunction, this, 0, 0);
Все эти потоки имеют ссылки на исходный объект, например:
// Thread initialization function for receiving RTP messages from a newly connected client.
static int WINAPI receiveRtpMessageFunction(LPVOID lpClient)
{
LOG_METHOD("receiveRtpMessageFunction");
Client * client = (Client *)lpClient;
while(client ->isConnected())
{
if(client ->receiveMessage() == ERROR)
{
Log::log("receiveRtpMessageFunction Failed to receive message");
}
}
return SUCCESS;
}
Периодически объект «Клиент» удаляется (по разным веским и достаточным причинам). Но когда это происходит, потоки обработки, которые все еще имеют ссылки на (теперь удаленный) объект, генерируют исключения того или иного рода при попытке доступа к функциям-членам этого объекта.
Так что я уверен, что есть стандартный способ справиться с этой ситуацией, но я не смог найти правильный подход. Я не хочу просто прекратить поток, поскольку это не позволяет очистить ресурсы. Я не могу установить свойство для объекта, так как именно свойства объекта становятся недоступными.
Мысли о том, как лучше всего с этим справиться?