防止变量脱离范围,因此它们仍然存在另一个线程
Preventing variables from going out of scope so they persist for another thread
我具有创建一堆本地变量的函数,然后将其地址传递给在单独线程中运行的函数 - 类似的内容:
void MyFunction()
{
MyClass a;
AnotherClass b;
...
FinalClass z;
CallFunctionInNewThread(&a,&b,&c,...,&z);
}
当然,当我的函数范围范围内(因此线程中的功能现在指向垃圾)时,这些变量将被破坏,因此此设置不起作用。我在这里有什么选择?如果我用"新"分配堆上的变量,我将永远不会有机会删除它们。如果我使它们成为聪明的指针或类似的指针,我必须使螺纹功能接受为智能指针,否则它们的参考计数不会增加,因此它们仍然会立即被破坏。看来他们有点想成为我功能的包装器类别的成员变量,但是有几百条线和数十件事,这只是疯狂的混乱。还有其他选择吗?
还有其他选择吗?
简单地复制(如果很琐碎)或移动/交换数据(如果很重),类似于将所有权从一个线程转移到另一个线程。似乎线程A确实不需要描述中的参考。奖金:这可以消除您程序中的并发访问复杂性。
您可以做的一个小技巧是将信号量对象传递到线程函数中,然后等待信号信号。您确实需要检查该线程是否成功创建。
新线程首先制作值的本地副本(或在智能指针的情况下引用),然后发出信号并携带的信号。
然后,调用线程可以继续并将这些对象从其堆栈中删除,而不会干扰您的新线程。它甚至可以删除信号量对象,因为这两个线程不再需要。
这确实意味着调用线程必须等到线程启动并已复制数据,但这可能是很短的时间。如果您要努力产生线程以完全进行任何工作,那么父母线程中的这种轻微延迟应该是可以接受的。
相关文章:
- 在已经存在的类中调用线程,而不是创建一个线程
- 线程:join上是否存在具有synchronized with relationship的隐式内存障碍
- 原子线程围栏:为什么在这个非原子变量上存在数据竞争?这有关系吗
- 是否存在简单的指向布尔值作为线程取消标志的现实情况,无法有效地取消线程?
- boost ::线程在删除可加入线程时存在什么问题
- 防止变量脱离范围,因此它们仍然存在另一个线程
- 当只有一个线程写入 c++ 中的布尔变量时,是否存在争用条件
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- stl或boost中是否存在用于线程间通信的线程安全结构,其行为类似于队列
- 线程ID不存在的OpenThread
- 两个线程之间是否存在任何内存泄漏(缓冲、清空)
- Boost:是否存在用于仅线程通信的进程间消息队列机制
- 如何确保始终存在给定数量的线程?(另外,这是线程的良好用法吗?
- 没有CUDA代码的线程中存在CUDA分段错误
- 在静态初始化期间,pthread线程变量何时开始存在
- 如果存在仅推送线程和仅弹出线程,那么C++std::队列安全吗
- 为什么 gui 线程不应该存在于多线程单元中?
- Boost smart_ptr非线程安全宏,它真的存在吗?
- Qt5中存在哪些同步原语,允许我在单个线程中等待信号到达
- 多线程程序,它将线程保存在vector而不是数组中