Сделать массив или словарь типом значения по определению, но затем фактически скопировать его только тогда, когда одна ссылка на него пытается изменить его, — прекрасная идея, но это заставляет меня насторожиться в многопоточном/многопотоковом контексте. Мне нужно знать:
Является ли возможность Swift копирования при записи потокобезопасной? например: если я создаю массив в одной очереди и передаю его в другую очередь, безопасно ли для одной из очередей изменять его, в то время как другая может его читать или изменять? Поскольку по определению копирование было сделано, когда ссылка на массив была передана во вторую очередь, можем ли мы предположить, что инженеры Swift поступили правильно и реализовали копирование при записи безопасным для очередей способом?
Я нашел это старое обсуждение этого, которое кажется авторитетным, но в обоих направлениях! https://developer.apple.com/forums/thread/53488
Некоторые заслуживающие доверия голоса говорят, что это потокобезопасно, другие говорят, что это не так. Я предполагаю, что это может быть потому, что в какой-то ранней версии Swift этого не было, а, возможно, в Swift 5 это так. Кто-нибудь здесь точно знает Swift 5?
Вот пример кода, иллюстрирующий проблему:
func func1()
{
var strings1: [String] = ["A", "B", "C"]
var strings2: [String] = strings1 // array not actually copied
queue.async()
{
strings2.append("D")
}
print(strings1[0]) // is this reference thread-safe?
strings1.append("E") // is this modification thread-safe?
}