我有一个创建一堆局部变量的函数,然后将它们的地址传递给一个在单独的线程中运行的函数 - 如下所示:
void MyFunction()
{
MyClass a;
AnotherClass b;
...
FinalClass z;
CallFunctionInNewThread(&a,&b,&c,...,&z);
}
当然,当MyFunction超出范围时会破坏这些变量(因此线程中的函数现在指向垃圾),因此这种设置不起作用。我有什么选择?如果我使用'new'在堆上分配变量,我将永远不会有机会删除它们。如果我使它们成为智能指针或类似物,我必须使线程函数接受它们作为智能指针,否则它们的引用计数将不会增加,因此它们仍会立即被销毁。看起来他们有点想成为MyFunction的包装类的成员变量,但是有几百行和几十个这些东西,这只是疯狂的混乱。还有其他选择吗?
答案 0 :(得分:0)
你可以做的一个小技巧是将一个信号量对象传递给线程函数,然后等待该信号量发出信号。您需要检查线程是否已成功创建。
新线程首先创建值的本地副本(或智能指针的引用),然后发信号通知信号并继续。
然后调用线程可以继续并从堆栈中删除这些对象,而不会干扰您的新线程。它甚至可以删除信号量对象,因为任何一个线程都不再需要它。
这确实意味着调用线程必须等到线程启动并复制其数据,但这可能会很短。如果你要产生一个线程来完成任何工作,那么父线程中的这种轻微延迟应该是可以接受的。
答案 1 :(得分:0)
还有其他选择吗?
简单地复制(如果是微不足道)或移动/交换数据(如果要创建很重) - 类似于将所有权从一个线程转移到另一个线程。似乎线程A确实不需要描述中的引用。额外奖励:这将从您的程序中删除并发访问复杂性。