【发布时间】:2020-10-12 17:42:43
【问题描述】:
我正在编写一个并行程序,在该程序中我必须重新分配一个内存块,该内存块正在被其他线程主动写入。执行此操作的自然方法是使用realloc,但是在并行写入的块上调用realloc 时,有两种可能的结果:
-
realloc能够扩大分配。没有问题发生。 -
realloc必须创建新分配,将旧分配的内容复制到新分配,并释放原始分配。
第二种情况有问题有两个原因:
首先,因为初始分配中的一个字节可以被写入之后该字节已被复制和realloc 返回之前。在这种情况下,一旦旧的分配被释放,写入将丢失。
其次,因为realloc 将在旧分配返回之前释放它,因此同时访问该内存区域的其他线程将读取释放的内存,这不能保证是安全的。
目前,我使用一种解决方法,即到malloc、memcpy,然后是free,并使用信号量确保所有线程都已移至新分配,然后再调用free。
但是,这种方法放弃了 realloc 的主要优点——如果有空间可以扩展分配。所以,我的问题是extend_allocation 是否有某种方法可以扩展分配或失败(在这种情况下我可以回退到 malloc/memcpy/free),或者我是否必须使用 malloc/memcpy/free时间?
我们也欢迎对有解决此问题的替代内存分配器的建议作为答案。
【问题讨论】:
标签: c memory-management concurrency realloc