Назад к задачам
AvitoПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
6
Обнаружение проблем в представленном Swift‑коде
Компании, где спрашивали:
Условие задачи
В данном примере реализован сервис для хранения пар «идентификатор – имя». Класс PersonRegistry предоставляет методы добавления, удаления и получения значения по ключу. Затем несколько задач одновременно добавляют и удаляют записи в общем словаре, а также читают из него. Поскольку доступ к общей коллекции происходит из разных потоков без какой‑либо синхронизации, код подвержен гонкам данных и потенциальным сбоям. Ниже показан оригинальный код с переименованными переменными.
class PersonRegistry {
private var storage = [String: String]()
func insert(value: String, for key: String) {
storage[key] = value
}
func delete(key: String) {
storage[key] = nil
}
func fetch(key: String) -> String? {
return storage[key]
}
}
let registry = PersonRegistry()
let workQueue = DispatchQueue(label: "Work Queue", attributes: .concurrent)
for i in 0..<1000 {
let id = String(describing: i)
let name = String(describing: i)
workQueue.async {
registry.insert(value: name, for: id)
}
workQueue.async {
registry.delete(key: id)
}
}
workQueue.async {
for i in 0..<1000 {
let id = String(describing: i)
_ = registry.fetch(key: id)
}
}