Назад к задачам
Junior — Senior
6

Обнаружение проблем в представленном Swift‑коде

Компании, где спрашивали:

AvitoAvito
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

В данном примере реализован сервис для хранения пар «идентификатор – имя». Класс 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)
    }
}