跨线程释放内存是一种不好的做法吗?这样一个线程分配内存,并在退出后将指针传递给主线程以释放内存。我觉得答案是肯定的,但我只是想知道。
在我的代码中这样做的目的是让主线程可以在内存被释放之前对它做一些其他的事情。就我而言,有很多解决方法,我完全可以使用。但是,在我的情况下,让一个线程将 void * 返回到一块内存可以使代码非常方便。
编辑:我知道这样做没有技术故障。
跨线程释放内存是一种不好的做法吗?这样一个线程分配内存,并在退出后将指针传递给主线程以释放内存。我觉得答案是肯定的,但我只是想知道。
在我的代码中这样做的目的是让主线程可以在内存被释放之前对它做一些其他的事情。就我而言,有很多解决方法,我完全可以使用。但是,在我的情况下,让一个线程将 void * 返回到一块内存可以使代码非常方便。
编辑:我知道这样做没有技术故障。
线程将分配给另一个线程的内存控制权传递给另一个线程并没有错。例如,在生产者/消费者模型中,生产者线程为它产生的任何东西分配内存,然后将对该内存的控制权交给消费者线程以供消费者线程使用和释放,这是非常合理的。
只要它对您的数据流模型有意义,特别是对您的程序对对象生命周期的要求,这不是“坏习惯”,但它可能会产生成本。许多现代分配器使用线程局部区域,在同一线程中分配和释放对象不会导致同步损失,但在不同线程中释放它会强制同步或产生其他成本。我不会因为这个原因改变你的设计,除非它是一个主要的瓶颈,但是考虑到这个实现细节,你也可以考虑其他设计,比如让线程将其输出存储在参数中父线程提供的缓冲区中线程启动函数。
所有线程共享一个公共堆。哪个线程分配或释放内存无关紧要,只要其他线程在释放内存时完成使用内存即可。
动态内存使用伴随着您完全控制它的责任。用户有责任显式管理动态分配对象的生命周期,并确保在对象的预期生命周期结束后释放它。跨不同线程使用的动态分配的内存块没有任何问题。同一个进程中的所有线程共享同一个堆区域。唯一需要注意的是对象生命周期的定义和范围都很明确。