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

上記のコードで、このオブジェクトが削除された場合、スレッド関数の自己オブジェクトをチェックインする方法が削除されます

4

1 に答える 1

0

COM のように参照カウントを使用します。メイン スレッドがオブジェクトの処理を完了すると、「削除済み」フラグを設定してオブジェクトを解放できます。スレッドがまだ参照カウントを保持しているため、オブジェクトはまだ削除されません。ただし、スレッドはフラグをチェックし、フラグが設定されている場合はオブジェクトを解放できます。参照カウントは 0 になり、オブジェクトは呼び出しによって自殺します。delete this;

于 2013-08-03T08:35:01.617 に答える