gpt4 book ai didi

c++ - 删除对象时清理引用对象的线程(在 C++ 中)

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:07 25 4
gpt4 key购买 nike

我有一个对象 (Client * client),它启动多个线程来处理各种任务(例如处理传入数据)。线程是这样启动的:

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

客户端对象会定期被删除(出于各种充分和充分的原因)。但是当这种情况发生时,仍然引用(现已删除)对象的处理线程在尝试访问该对象的成员函数时抛出一种或另一种异常。

所以我确信有一种标准方法可以处理这种情况,但我一直无法找到一种干净的方法。我不想只是终止线程,因为这不允许清理资源。我无法在对象上设置属性,因为恰恰是对象上的属性变得不可访问。

关于处理此问题的最佳方法的想法?

最佳答案

我会通过为您的对象引入引用计数来解决这个问题。工作线程将持有一个引用,对象的创建者也是如此。您不使用 delete,而是减少引用计数,删除最后一个引用的人就是实际调用 delete 的人。

您可以使用现有的引用计数机制(shared_ptr 等),或者您可以使用 Win32 API InterlockedIncrement()InterlockedDecrement() 来滚动您自己的引用计数机制 或类似的(也许引用计数是 volatile DWORD 从 1... 开始)。

唯一缺少的另一件事是当主线程释放它的引用时,它应该向工作线程发出信号以删除它自己的引用。你可以做到这一点的一种方法是通过 event ;您可以将工作线程的循环重写为对 WaitForMultipleObjects() 的调用,并且当发出某个事件的信号时,您认为这意味着工作线程应该清理并删除引用。

关于c++ - 删除对象时清理引用对象的线程(在 C++ 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2411556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com