0

我有一个创建一堆局部变量的函数,然后将它们的地址传递给在单独线程中运行的函数 - 如下所示:

void MyFunction()
{
    MyClass a;
    AnotherClass b;
    ...
    FinalClass z;

    CallFunctionInNewThread(&a,&b,&c,...,&z);
}

当然,当 MyFunction 超出范围时,这些变量会被销毁(因此线程中的函数现在指向垃圾),因此此设置不起作用。我在这里有什么选择?如果我用'new'分配堆上的变量,我将永远没有机会删除它们。如果我让它们成为智能指针或类似的东西,我必须让线程函数接受它们作为智能指针,否则它们的引用计数不会增加,所以它们仍然会立即被销毁。看起来他们有点想成为 MyFunction 的包装类的成员变量,但是有几百行和几十个这样的东西,那将是疯狂的混乱。还有其他选择吗?

4

2 回答 2

0

您可以做的一个小技巧是将信号量对象传递给线程函数,然后等待该信号量发出信号。您确实需要检查线程是否已成功创建。

新线程首先制作值的本地副本(或智能指针的引用),然后向信号量发出信号并继续。

然后,调用线程可以继续并将这些对象从堆栈中删除,而不会干扰您的新线程。它甚至可以删除信号量对象,因为任何一个线程都不再需要它。

这确实意味着调用线程必须等到线程启动并复制其数据,但这可能会很短。如果您要努力生成一个线程来完成任何工作,那么父线程中的这种轻微延迟应该是可以接受的。

于 2012-11-02T01:32:47.223 回答
0

还有其他选择吗?

只需复制(如果微不足道)或移动/交换数据(如果创建繁重) - 类似于将所有权从一个线程转移到另一个线程。似乎线程 A 确实不需要描述中的引用。奖励:这消除了程序中并发访问的复杂性。

于 2012-11-02T01:52:16.997 回答