8 месяцев назад
История
README.md
Решение тестовой задачи по Го
Код
Решение находится в файле src/w4.go.
В чем подвох?
Если
- запустить
w4.go
с помощьюgo run -race src/w4.go
и - отправить несколько запросов
PUT
иGET
(./curl-put.sh; ./curl-get.sh
),
то в консоли отобразится следующая ошибка.
==================
WARNING: DATA RACE
Write at 0x00c0001089c0 by goroutine 10:
runtime.mapaccess2_faststr()
/usr/local/go/src/runtime/map_faststr.go:108 +0x42c
main.putRoutine()
/Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:52 +0x5b4
main.dbHandler()
/Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:99 +0x98
net/http.HandlerFunc.ServeHTTP()
/usr/local/go/src/net/http/server.go:2166 +0x48
net/http.(*ServeMux).ServeHTTP()
/usr/local/go/src/net/http/server.go:2683 +0x17c
net/http.serverHandler.ServeHTTP()
/usr/local/go/src/net/http/server.go:3137 +0x298
net/http.(*conn).serve()
/usr/local/go/src/net/http/server.go:2039 +0xf28
net/http.(*Server).Serve.gowrap3()
/usr/local/go/src/net/http/server.go:3285 +0x4c
Previous read at 0x00c0001089c0 by goroutine 7:
runtime.mapdelete()
/usr/local/go/src/runtime/map.go:696 +0x43c
main.evictEligibleKeys()
/Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:126 +0xd8
main.evictLogic()
/Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:116 +0x4c
main.startEviction.gowrap1()
/Users/dp118m/dev/misc/go-2024-02-15/src/w4.go:150 +0x20
Это означает, что куски кода
et[curKey.(string)] = expirationTime
в w4.go:52
(putRoutine()
) и
for key, expirationTime := range et {
в w4.go:126
(main.evictEligibleKeys()
) одновременно пишут и читают словарь et
.
Как решить эту проблему?
Использовать мютекс при записи и чтении из и в словарь et
.
etMutex.Lock()
defer etMutex.Unlock()
См. src/w5.go.
Конвейеры
0 успешных
0 с ошибкой