Q
分配未初始化片
2
A
回答
0
从技术上讲,您可以通过在运行时间外分配内存并使用unsafe.Pointer
,但这绝对是错误的做法。
更好的解决方案是减少分配数量。将缓冲区移到循环之外,或者,如果需要每个goroutine缓冲区,则将其中的几个分配给一个池,并只在需要时分配更多。
type BufferPool struct {
Capacity int
buffersize int
buffers []byte
lock sync.Mutex
}
func NewBufferPool(buffersize int, cap int) {
ret := new(BufferPool)
ret.Capacity = cap
ret.buffersize = buffersize
return ret
}
func (b *BufferPool) Alloc() []byte {
b.lock.Lock()
defer b.lock.Unlock()
if len(b.buffers) == 0 {
return make([]byte, b.buffersize)
} else {
ret := b.buffers[len(b.buffers) - 1]
b.buffers = b.buffers[0:len(b.buffers) - 1]
return ret
}
}
func (b *BufferPool) Free(buf []byte) {
if len(buf) != b.buffersize {
panic("illegal free")
}
b.lock.Lock()
defer b.lock.Unlock()
if len(b.buffers) < b.Capacity {
b.buffers = append(b.buffers, buf)
}
}
2
你可以得到非归零字节的缓冲区从bufs.Cache.Get(或见CCache
的并发安全版本)。从docs:
注:通过获取不能保证返回的缓冲区将被归零。没关系,例如将缓冲区传递给io.Reader。如果您需要使用Cget的零缓冲区。
相关问题
- 1. 分配初始化
- 2. 分配/初始化
- 3. 已分配但未初始化
- 4. 未初始化值由堆栈分配
- 5. 结构初始化/分配
- 6. 初始化时内存将分配给“未初始化的静态变量”吗?
- 7. Android RecyclerView适配器未初始化
- 8. ProgressIndicatior未初始化
- 9. SelectCommand.Connection未初始化
- 10. 值未初始化
- 11. SWFUpload未初始化
- 12. Phaser.State未初始化
- 13. Firebase未初始化
- 14. URLProtocol未初始化
- 15. Applet未初始化
- 16. java.lang.IllegalStateException:ApplicationEventMulticaster未初始化 -
- 17. TilesContainer未初始化
- 18. Module.DEFAULT_REFLECTOR未初始化
- 19. ImageView未初始化
- 20. CRT未初始化
- 21. Android:java.lang.NullPointerException:CameraUpdateFactory未初始化
- 22. $ _POST未初始化
- 23. ArrayList未初始化
- 24. java.lang.IllegalStateException:ApplicationEventMulticaster未初始化
- 25. CameraUpdateFactory未初始化
- 26. 初始化脚本mongos和配置服务器MongoDB的分片
- 27. 开始:Applet未初始化
- 28. nm的未初始化数据部分
- 29. 拆分产生未初始化的值
- 30. 未初始化代码的一部分
另请注意,在该示例中,忘记在缓冲区中调用Free会导致它仅收集垃圾并且未添加回池中,因此不会泄漏。 – cthom06
您是否应该使用缓冲通道来存储您释放的缓冲区? –
@MattJoiner你可以这样做,但你仍然需要一个锁来安全地检查有多少物品被缓冲,所以你只是锁定两次,或者不检查长度,但你会泄漏goroutines,因为你会总是有(peak_use - capacity)goroutines等待推送到频道。 – cthom06