Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用动态参数创建线程_C++ - Fatal编程技术网

C++ 使用动态参数创建线程

C++ 使用动态参数创建线程,c++,C++,我正在用一个动态分配的对象作为参数从主线程创建一个线程。但若我们在主线程中删除这个动态内存分配对象,那个么我们怎么能发现一个对象在创建的线程中被删除了呢。 主线程代码: int CLocalReader::Run() { TReaderArgument *readerArg = new TReaderArgument; readerArg->iFinished = &theFinishedACE; readerArg->iSelf = this; #ifdef WIN32

我正在用一个动态分配的对象作为参数从主线程创建一个线程。但若我们在主线程中删除这个动态内存分配对象,那个么我们怎么能发现一个对象在创建的线程中被删除了呢。 主线程代码:

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;
int CLocalReader::Run()
{
踏板参数*readerArg=新踏板参数;
readerArg->iFinished=&thefinishedac;
readerArg->iSelf=此;
#ifdef WIN32
if(ACE_Thread::spawn((ACE_THR_FUNC)LocalReaderFunc,readerArg)=-1)
{
ACE_调试((LM_调试,“无法启动读取器”);
删除readerArg;
readerArg=NULL;
}
#否则
if(ACE_Thread_Manager::instance()->spawn(ACE_THR_FUNC(LocalReaderFunc)、readerArg、THR_NEW_LWP | THR_DETACHED)<0)
{
ACE_调试((LM_调试,“无法启动读取器”);
删除readerArg;
readerArg=NULL;
}
#恩迪夫
返回无;
}

static void*ReaderFunc(void*arg)
{
断言(arg);
ACE_线程::yield();
ACE_OS::睡眠(ACE_时间_值(0,启动_时间));
traderargument*rarg=(traderargument*)arg;
CLocalReader*self=静态施法(rarg->iSelf);
int*finished=rarg->i完成;
而(!(*完成))
{
如果(self->GetData()!=KErrorNone)
{
ACE_调试((LM_调试,“%D本地读取器:接收数据时出错\n”);
}
}
返回0;
}

如果在上面的代码中,这个对象被删除了,那么我们如何签入线程函数self object被删除呢。当主线程处理完对象后,它可以设置一个标志“deleted”并释放该对象。对象还不会被删除,因为线程仍保留引用计数。但是,如果设置了标志,线程可以检查标志并释放对象。引用计数将降至0,对象将通过调用
delete自杀

更新您提供的代码<据我所知,code>if
语句仅在函数部分有效。现在还不清楚代码的哪一部分在哪里
Arg
是类实例还是
Arg->iSelf
是静态实例?我也没有看到任何事实,任何对象正在删除这里。因为对象可能在堆中。即使你失去了对对象的引用。除非你明确地删除它,否则它仍然是活的。在主线程中,我们必须在一个条件下明确地删除这个对象。但我不知道如何在线程函数中检查这个对象是否被删除。(1)缩进代码。(2) 假设您发现对象已被删除,您将如何处理这些知识?当CLocalReader对象在主线程中被删除,但此地址(self)仍用于创建线程时。当我们删除对象或通知线程对象(self)已删除并退出循环时,是否也可以终止线程。有人能给我建议一下解决办法吗?提前感谢您的帮助。是否可以确保在线程加入主线程之前不会删除对象?
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;
}