防止变量超出范围,因此它们会持续存在于另一个线程中

时间:2012-11-02 00:42:11

标签: c++ multithreading

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

新线程首先创建值的本地副本(或智能指针的引用),然后发信号通知信号并继续。

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

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

答案 1 :(得分:0)

  

还有其他选择吗?

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