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. SelectCommand.Connection未初始化
- 6. Applet未初始化
- 7. java.lang.IllegalStateException:ApplicationEventMulticaster未初始化
- 8. SWFUpload未初始化
- 9. Module.DEFAULT_REFLECTOR未初始化
- 10. ImageView未初始化
- 11. CameraUpdateFactory未初始化
- 12. 值未初始化
- 13. CRT未初始化
- 14. ProgressIndicatior未初始化
- 15. Android:java.lang.NullPointerException:CameraUpdateFactory未初始化
- 16. Phaser.State未初始化
- 17. URLProtocol未初始化
- 18. $ _POST未初始化
- 19. java.lang.IllegalStateException:ApplicationEventMulticaster未初始化 -
- 20. 初始化腳本mongos和配置服務器MongoDB的分片
- 21. 未初始化代碼的一部分
- 22. nm的未初始化數據部分
- 23. 未初始化的初始值常量
- 24. xCode 4.6對象分配和初始化
- 25. 一次初始化或分配可變
- 26. 分配tensorflow:主管沒有初始化?
- 27. 的UIImagePickerController崩潰上分配/初始化
- 28. C#變量初始化VS分配
- 29. C#初始化類並分配值Newtonsoft.Json
- 30. 字符串分配和初始化
另請注意,在該示例中,忘記在緩衝區中調用Free會導致它僅收集垃圾並且未添加回池中,因此不會泄漏。 – cthom06
您是否應該使用緩衝通道來存儲您釋放的緩衝區? –
@MattJoiner你可以這樣做,但你仍然需要一個鎖來安全地檢查有多少物品被緩衝,所以你只是鎖定兩次,或者不檢查長度,但你會泄漏goroutines,因爲你會總是有(peak_use - capacity)goroutines等待推送到頻道。 – cthom06