Arrays 创建线程安全阵列,简单的方法?

Arrays 创建线程安全阵列,简单的方法?,arrays,swift,thread-safety,Arrays,Swift,Thread Safety,我刚刚阅读了有关在Swift中创建线程安全数组类型的内容。当我浏览代码示例时,我问自己是否有办法用更少的代码来实现这一点 假设我创建了这个类: //标记:类别声明 类ThreadsafeArray{ //私有变量 私有变量数组:[Element]=[] 私有变量数组队列:DispatchQueue=DispatchQueue 标签:ThreadsafeArray.\uuu concurrentArrayQueue, 属性:。并发 } //标记:接口 扩展线程安全阵列{ //读写变量 var th

我刚刚阅读了有关在Swift中创建线程安全数组类型的内容。当我浏览代码示例时,我问自己是否有办法用更少的代码来实现这一点

假设我创建了这个类:

//标记:类别声明 类ThreadsafeArray{ //私有变量 私有变量数组:[Element]=[] 私有变量数组队列:DispatchQueue=DispatchQueue 标签:ThreadsafeArray.\uuu concurrentArrayQueue, 属性:。并发 } //标记:接口 扩展线程安全阵列{ //读写变量 var threadsafe:[元素]{ 得到{ 返回self.\uu arrayQueue.sync{ 返回self.\u数组 } } setnewArray{ self.\uu arrayQueue.asyncflags:.屏障{ self.\uuu数组=新数组 } } } } 如果从现在起,我只通过.threadsafe访问实际数组,这是否足以使数组线程安全

另外,我是否可以将其实现为一个结构而不是一个类来获得变异检查

我知道这个数组中的对象本身不会是线程安全的,但这不是重点,所以假设我只在其中放了线程安全的东西

当然,为了避免对.threadsafe的调用,我会使这个闪亮的新类符合ExpressibleByArrayLiteral、Collection和RangeReplaceableCollection,这样我就可以像普通数组一样使用它

编辑 同时,我也尝试过测试它,并且相信它是不够的

游乐场守则: 进口基金会 导入PlaygroundSupport PlaygroundPage.current.NeedsDefiniteExecution=true //测试// //线程不安全数组 func射线{ 变量数组:[Int]=[] 变量迭代次数:Int=1000 让我们开始:TimeInterval=Date.timeIntervalSince1970 DispatchQueue.ConcurrentPerformities:迭代{索引在中 let last:Int=array.last±0 array.appendlast+1 DispatchQueue.global.sync{ 迭代次数-=1 //最终回路
另一种锁定对象的方法是:

func lock(obj: AnyObject, work:() -> ()) {
    objc_sync_enter(obj)
    work()
    objc_sync_exit(obj)
}

您的类是否可以在需要时使用它来锁定其标准数组?

我怀疑这一行是您的问题:

DispatchQueue.global().sync { ...
如果在此处指定要使用的一个串行队列,则应获得所需的结果

比如:

let array = SynchronizedArray<Int>()
var iterations = 1000
let queue = DispatchQueue(label: "queue")

DispatchQueue.concurrentPerform(iterations: 1000) { index in
    array.append(array.last ?? 0)

    queue.sync {
        iterations -= 1

        if iterations == 0 {
            print(array.count)
        }
    }
}

另外,队列不应该是串行的而不是并发的吗?objc_sync_enter实际上并不安全,也不应该直接使用。
func lock(obj: AnyObject, work:() -> ()) {
    objc_sync_enter(obj)
    work()
    objc_sync_exit(obj)
}
DispatchQueue.global().sync { ...
let array = SynchronizedArray<Int>()
var iterations = 1000
let queue = DispatchQueue(label: "queue")

DispatchQueue.concurrentPerform(iterations: 1000) { index in
    array.append(array.last ?? 0)

    queue.sync {
        iterations -= 1

        if iterations == 0 {
            print(array.count)
        }
    }
}