防止变量脱离范围,因此它们仍然存在另一个线程

Preventing variables from going out of scope so they persist for another thread

本文关键字:存在 线程 另一个 变量 范围      更新时间:2023-10-16

我具有创建一堆本地变量的函数,然后将其地址传递给在单独线程中运行的函数 - 类似的内容:

void MyFunction()
{
    MyClass a;
    AnotherClass b;
    ...
    FinalClass z;
    CallFunctionInNewThread(&a,&b,&c,...,&z);
}

当然,当我的函数范围范围内(因此线程中的功能现在指向垃圾)时,这些变量将被破坏,因此此设置不起作用。我在这里有什么选择?如果我用"新"分配堆上的变量,我将永远不会有机会删除它们。如果我使它们成为聪明的指针或类似的指针,我必须使螺纹功能接受为智能指针,否则它们的参考计数不会增加,因此它们仍然会立即被破坏。看来他们有点想成为我功能的包装器类别的成员变量,但是有几百条线和数十件事,这只是疯狂的混乱。还有其他选择吗?

还有其他选择吗?

简单地复制(如果很琐碎)或移动/交换数据(如果很重),类似于将所有权从一个线程转移到另一个线程。似乎线程A确实不需要描述中的参考。奖金:这可以消除您程序中的并发访问复杂性。

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

新线程首先制作值的本地副本(或在智能指针的情况下引用),然后发出信号并携带的信号。

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

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