我正在编写独立于操作系统的无锁队列,到目前为止,它工作得很好,但是内存管理方面的问题很小。我不确定它的gcc问题还是我的。问题:将元素添加到列表时,内存增加,但是从列表中删除元素(free(elementPointer);)时,内存使用率没有变化。
但是,当我使用pthreads时,N个生产者和M个消费者的 (1<N<20, 1<M<20)内存使用量始终约为10mb(当尝试添加和删除〜10kk元素时),因此看起来自由工作了。
(1<N<20, 1<M<20)
有趣的是,在VS 2010中(相同的代码,没有线程),免费工作正常,释放了内存(受监视的任务管理器)。
我进行了测试,添加了1kk元素,添加了所有元素之后,将所有元素一一删除(没有线程)。
Linux-0.08秒
Windows〜57秒
Linux(免费)-0.07秒
Windows(免费)-0.9秒
因此,问题是,当不使用线程时,为什么在Linux C中不释放内存?如果需要,我可以发布代码。
GCC版本:4.4.3
在许多操作系统上,free()不会再次使内存可供OS使用,而只能“用于”对的新调用malloc()。这就是为什么您看不到内存使用量从外部下降的原因,但是当您通过线程增加新分配的数量时,内存将被重新使用,因此总使用量不会浪费。
free()
malloc()