писать и читать десятки горутин. Есть основная структура которая реализует io.ReadWriter, поле offset, len и т.д, подобного формата.
type file struct {
fd *os.File
offset int64 // read offset
len int32 // length of blocks
mx *sync.RWMutex
}
И сейчас я использую sync.RWMutex, когда читаю из файла использую mx.RLock(), defer mx.RUnlock(). Но хочу добиться максимальной производительности при конкурентном чтении и записи, defer тоже жрет что-то порядка 40нс и мьютекси сами по себе не бесплатное удовольствие, а вот что почти бесплатное так это атомарные операции.
Вопрос, атомарными операциями можно обмазаться?
Ну что-то по типу подобного плана
n, err := f.fd.ReadAt(atomic.LoadInt64(&f.offset))
if err != nil {
return err
}
atomic.AddInt64(&f.offset, int64(n))
atomic.AddInt32(&f.len, 1)
операция чтения/записи файла в принципе не выглядит атомарной, так что скорее всего нельзя, ну а ваш пример тем более с гонкой
Обсуждают сегодня