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