Я выполнял задание, в котором нужно написать многопоточный кэш для БД.
— Изначально кэш пустой, потом при обращении клиентов, начинает дергать данные из БД.
— Запись одновременно может читать только один поток.
— Периодически кэш-система заливает изменения обратно в БД.
— Прослойка БД — сделана условно, сэмулированна, это нормально.
Ревьюверу реализация не понравилось и он отметил, что есть баги.
Я очень хочу поднять свой уровень, поэтому обращаюсь за помощью. Могли бы вы обратить моё внимание на:
— баги в многопоточности (неверная синхронизация, потенциальные deadlocks, races, AV, и т.п.)
— серьезные performance баги (совсем мелкие можно не замечать) из-за неверных структур или суровая неэффективность алгоритмов
— по стилистике (оформление, названия, форматирование и т.п.) можно не обращать внимание, сейчас не это главное
Спасибо!
Re: Найти фундаментальные ошибки в многопоточном кэше
Здравствуйте, Juster, Вы писали:
J>Здравствуйте!
J>Я выполнял задание, в котором нужно написать многопоточный кэш для БД.
J>- Изначально кэш пустой, потом при обращении клиентов, начинает дергать данные из БД. J>- Запись одновременно может читать только один поток. J>- Периодически кэш-система заливает изменения обратно в БД. J>- Прослойка БД — сделана условно, сэмулированна, это нормально.
J>https://github.com/Yukigaru/RJCache
J>Ревьюверу реализация не понравилось и он отметил, что есть баги. J>Я очень хочу поднять свой уровень, поэтому обращаюсь за помощью. Могли бы вы обратить моё внимание на: J>- баги в многопоточности (неверная синхронизация, потенциальные deadlocks, races, AV, и т.п.) J>- серьезные performance баги (совсем мелкие можно не замечать) из-за неверных структур или суровая неэффективность алгоритмов J>- по стилистике (оформление, названия, форматирование и т.п.) можно не обращать внимание, сейчас не это главное
J>Спасибо!
Тут жесть прямо на каждом шагу. Если бы я был ревьювером, то до вопросов про многопоточность и алгоритмы я бы не дошел.
Вроде как везде советуют писать код так, чтобы его было потом удобно читать. Код, отправляемый на ревью наверное стоило бы писать особенно аккуратно.
Собирается с 7 предупреждениями, но фиг с ними...
О существовании typedef вам явно известно, отчего же везде копипаста навроде std::vector<std::pair<const std::string*, const std::string*>>?
О существовании многих других полезных вещей, навроде namespaces, ::std::map, references вроде тоже. Отчего же не используете?
Зато глобальные переменные, бардак с инклюдами, синхронизация и через ::std::atomic и через volotile bool тут как тут.
Начните заново с основ короче.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, VTT, Вы писали:
VTT>Тут жесть прямо на каждом шагу. Если бы я был ревьювером, то до вопросов про многопоточность и алгоритмы я бы не дошел. VTT>Вроде как везде советуют писать код так, чтобы его было потом удобно читать. Код, отправляемый на ревью наверное стоило бы писать особенно аккуратно. VTT>Собирается с 7 предупреждениями, но фиг с ними... VTT>О существовании typedef вам явно известно, отчего же везде копипаста типа навроде std::vector<std::pair<const std::string*, const std::string*>>? VTT>О существовании многих других полезных вещей, навроде namespaces, ::std::map, references вроде тоже. Отчего же не используете? VTT>Зато глобальные переменные, бардак с инклюдами, синхронизация и через ::std::atomic и через volotile bool тут как тут. VTT>Начните заново с основ короче.
Спасибо за уделенное время и ответ.
Re[2]: Найти фундаментальные ошибки в многопоточном кэше
Здравствуйте, VTT, Вы писали:
VTT>Тут жесть прямо на каждом шагу. Если бы я был ревьювером, то до вопросов про многопоточность и алгоритмы я бы не дошел. VTT>Вроде как везде советуют писать код так, чтобы его было потом удобно читать. Код, отправляемый на ревью наверное стоило бы писать особенно аккуратно. VTT>Собирается с 7 предупреждениями, но фиг с ними... VTT>О существовании typedef вам явно известно, отчего же везде копипаста навроде std::vector<std::pair<const std::string*, const std::string*>>? VTT>О существовании многих других полезных вещей, навроде namespaces, ::std::map, references вроде тоже. Отчего же не используете? VTT>Зато глобальные переменные, бардак с инклюдами, синхронизация и через ::std::atomic и через volotile bool тут как тут. VTT>Начните заново с основ короче.
Многое исправил:
— Убраны глобальные переменные.
— Исправлена утечка RecordCached структур в RJCache.
— Исправлена логическая ошибка в RJCache::getForWrite, теперь в нём не вызывается load.
— В DBEmulatorLayer vector заменён на map, O(N^2) алгоритм заменён на O(N log N).
— Добавлена thread safe обёртка для printf.
— Добавлены файлы Utils.h/cpp с random ф-циями.