iOS Swift5 будет использовать NSMutableDictionary с блокировками вместо var [:] для обеспечения безопасности потока? - PullRequest
0 голосов
/ 17 июня 2019

Я отлаживаю быстрый класс, унаследованный в проекте. Была предпринята попытка создать потокобезопасный словарь, используя быстрый словарь с семафором. Код не выполняется в многопоточной среде - быстрый словарь обрабатывается как структура и копируется при мутации независимо от семафора.

Я пытаюсь понять: Будет ли замена быстродействующего словаря на основе структур основанием ядра NSMutableDictionary (с семафором) обеспечить потокобезопасность кода?

Я вижу этот ответ для Objective-C , но мой вопрос касается изменения кода swift.

public class ThreadSafeDictionary<KeyType: Hashable, ValueType> {

    private var dictionary: [KeyType: ValueType] = [:]
    //change to:
    private let dictionary = NSMutableDictionary() //will this make the mutating code thread safe?

    public func add(key: KeyType, value: ValueType) {
    // semaphore wait
    // set value in dictionary
    // semaphore signal
    }
}

Или - есть ли способ использовать ключевые слова swift, такие как mutating или inout , чтобы убедиться, что семафоры не позволят нескольким потокам работать с копией быстрого словаря?

Обновлено: произошла ошибка в коде более высокого уровня, при создании 2 независимых экземпляров ThreadSafeDictionary. Исправление, которое решило проблему параллелизма.

1 Ответ

2 голосов
/ 17 июня 2019

Если вы поместите каталог Swift (например, struct,) в класс Swift (ссылочный тип), вы каким-то образом потеряете механизм копирования при записи структуры (который действительно предназначен для предотвращения многопоточности) , Поэтому вы ничего не получите, если поменяете внутренний элемент directory с типа Swift на NSMutableDirectory Фонда. Кроме того, mutating или inout не подразумевают никакой безопасности потока.

Чтобы сделать поток ThreadSafeDictionary безопасным, вам нужно обернуть все методы доступа к внутреннему каталогу, как вы изобразили в функции func add...(). Вместо использования семафоров вы также можете использовать GCD со своей собственной последовательной очередью.

...