【问题标题】:How to delete objects in multithreaded c++ program如何在多线程 C++ 程序中删除对象
【发布时间】:2014-03-21 14:19:09
【问题描述】:

我需要为每个“TankId”创建一个线程并在这些线程中进行一些并行处理。 线程完成工作后,我需要销毁线程并删除对象。 我编写了以下代码来为每个“TankId”创建一个线程。但我对此表示怀疑 一旦线程完成其工作(完成执行功能后),如何删除“TLS4_SoapPollClass”类的对象。 我是否需要创建一个对象数组来存储地址?请帮助我理解这个概念。

bool TLS4_SoapManagerClass::CALLBACK_StartThread(int TankId) 
{
    TLS4_SoapPollClass *_soapPoll = new TLS4_SoapPollClass(TankId);
    return true; 
}

TLS4_SoapPollClass::TLS4_SoapPollClass(int TankId)
{
    int ret = 0;
    sprintf(ThreadName,"TankId%d",TankId);

    if(InitThread(ThreadName,0))
    {
       ret = Resume();
    }
}


void TLS4_SoapPollClass::Execute()
{
    int i = 0;

    for(i = 0; i< WMSConfig.PollTankIterations; i++) 
    {
          if (IsItTimeToExit())
          {
               Debugger.Print(DEBUG_CRITICAL_MSG, "TLS4_SoapPollTank::Execute::Time to  
               exit. Return tank %hd", this->_tankId); 
               return;
          }

          if(!_soap_mgr->CALLBACK_GetReportStatus(this->_tankId)) 
          {
               _soap_mgr->AddReqMsg(this->_tankId, TLS4_SOAP_POLL_FOR_TANK_DELIVERIES);
          }
          else
          {
               break;
          }
          ThreadSleep(WMSConfig.PollTankInterval);
    }

    if(20 == i)
    {
        _soap_mgr->AddReqMsg(this->_tankId, TLS4_SOAP_REQ_STD_DELIVERIES);
    }
    _soap_mgr->CALLBACK_SetReportStatus(this->_tankId,0);
    Stop();
}

【问题讨论】:

  • 我们可以使用pthread_join阻止线程util它被终止,然后delete吗?我不确定它是否与您提到的“线程已完成其工作”相匹配。
  • 你能解释一下什么是线程函数,它的实际工作是什么,ResumeInitThread 函数实际上是做什么的?

标签: c++ multithreading class


【解决方案1】:

您可以创建一个数组来保存指向线程中创建的对象的指针。该数组可以在主线程中创建并作为数据指针(如 void*)传递给线程,以便您可以将其类型转换回线程并使用它。

一旦线程退出,就可以在主线程中清空内存。

【讨论】:

    【解决方案2】:

    如果您想在完成第一个函数后删除 TLS4_SoapPollClass 实例,那么为什么要在堆上创建它呢?如果你在堆栈上创建它一个 la

    TLS4_SoapPollClass _soapPoll(TankId);
    

    那么当 CALLBACK_StartThread 返回时它将被破坏(这似乎是该线程中唯一执行的事情?)。

    我希望我没有错过问题的重点,因为正如其他人指出的那样,您没有给我们提供很多信息。

    【讨论】:

    • 感谢您的回复。我已经共享了我的线程函数,即 Execute()。执行该函数后,我需要销毁该对象。一旦线程函数的执行完成,我需要删除对象。这种方法可以解决我的目的吗?
    • Execute 在哪里调用? SoapPollClass 实例是否在 Execute 之外使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2021-05-21
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多