如何删除多线程c ++程序中的对象

时间:2014-03-21 04:36:10

标签: c++ multithreading class

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

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();
}

2 个答案:

答案 0 :(得分:2)

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

线程退出后,您可以清除主线程中的内存。

答案 1 :(得分:0)

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

TLS4_SoapPollClass _soapPoll(TankId);

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

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