1

我正在从主线程创建一个线程,并以动态分配的对象作为参数。但是,如果我们在主线程中删除这个动态内存分配的对象,那么我们如何才能发现在创建的线程中删除了一个对象。主线程代码:

int CLocalReader::Run()
{
TReaderArgument *readerArg = new TReaderArgument;
readerArg->iFinished = &theFinishedACE;
readerArg->iSelf = this;

#ifdef WIN32
if (ACE_Thread::spawn((ACE_THR_FUNC)LocalReaderFunc, readerArg) == -1) 
{
ACE_DEBUG((LM_DEBUG,"Could not start reader\n")); 
delete readerArg;
readerArg = NULL;
}
#else
if (ACE_Thread_Manager::instance()->spawn(ACE_THR_FUNC (LocalReaderFunc), readerArg, THR_NEW_LWP | THR_DETACHED) < 0) 
{
ACE_DEBUG((LM_DEBUG,"Could not start reader\n")); 
delete readerArg;
readerArg = NULL;
}
#endif
return KErrNone;

}

static void *ReaderFunc(void *arg)
{
ASSERT(arg);
ACE_Thread::yield();
ACE_OS::sleep(ACE_Time_Value(0, STARTUP_TIME));

TReaderArgument *rarg = (TReaderArgument *)arg;

CLocalReader *self = static_cast<CLocalReader *>(rarg->iSelf);
int *finished = rarg->iFinished;
while (!(*finished))
{
if( self->GetData() != KErrorNone )
{
ACE_DEBUG((LM_DEBUG, "%D LocalReader : Error receiving data\n"));
}
}
return 0;
}

如果在上面的代码中,这个对象被删除了,那么我们如何检查线程函数 self 对象被删除了

4

1 回答 1

0

使用 COM 中的引用计数。当主线程处理完对象后,它可以设置一个标志“已删除”并释放该对象。该对象还不会被删除,因为线程仍然持有引用计数。但是,如果设置了标志,线程可以检查标志并释放对象。引用计数将降至 0,对象将通过调用自杀delete this;

于 2013-08-03T08:35:01.617 回答