代码之家  ›  专栏  ›  技术社区  ›  Ken Smith

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

  •  2
  • Ken Smith  · 技术社区  · 15 年前

    我有一个对象(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;
      }
    

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

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

    你认为最好的处理方法是什么?

    5 回复  |  直到 15 年前
        1
  •  1
  •   Matthieu M.    15 年前

    没有组合 shared_ptr weak_ptr 也许能救你。。。当对象有效时,可以对其调用方法,然后命令销毁它(仅使用 会)。

    我唯一能想到的就是先终止各种进程,然后销毁对象。通过这种方式,您可以确保每个进程优雅地终止,必要时清理自己的混乱(它可能需要对象来完成)。

    不能

    您可以从析构函数本身或通过重载各种 delete 行动,随便你。

        2
  •  2
  •   asveikau    15 年前

    delete ,则从引用计数开始递减,无论谁删除最后一个引用,都是真正调用 删除

    可以使用现有的引用计数机制( shared_ptr InterlockedIncrement() InterlockedDecrement() 或者类似的(可能参考计数是 volatile DWORD

    唯一缺少的另一件事是,当主线程释放其引用时,它应该向工作线程发出信号,让它删除自己的引用。一种方法是通过 event WaitForMultipleObjects() ,当某个事件发出信号时,您认为这意味着工作线程应该清理并删除引用。

        3
  •  0
  •   Reed Copsey    15 年前

    您将需要一些其他的状态对象,线程可以检查以验证“客户机”仍然有效。

        4
  •  0
  •   Nathan Kitchen    15 年前

    您可以将observer模式与线程中客户端的代理对象一起使用。代理就像智能指针一样,将访问转发到真正的客户端。当您创建它们时,它们向客户机注册自己,这样客户机就可以从其析构函数中使它们失效。一旦它们失效,它们就停止转发并返回错误。

        5
  •  0
  •   stefaanv    15 年前

    这可以通过向线程传递(boost)弱指针来处理。

    推荐文章