2017-10-05 12 views
1

スレッドセーフ配列を作成しようとしているが、それは私がその配列は、いくつかの混乱を持っている必要がありますがSAFEARRAYは9DispatchQueue障壁問題

に0から番号を持つべきであると予想

import Foundation 
import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

public class SafeArray<Element> { 
    private var array = [Element]() 
    private let queue = DispatchQueue(label: "queueBarrier", attributes: .concurrent) 

    public func append(element: Element) { 
     queue.async(flags: .barrier) { 
      self.array.append(element) 
     } 
    } 

    public var elements: [Element] { 
     var result = [Element]() 
     queue.sync { 
      result = self.array 
     } 
     return result 
    } 

    public var last: Element? { 
     var result: Element? 
     queue.sync { 
      result = self.array.last 
     } 
     return result 
    } 
} 




var safeArray = SafeArray<Int>() 
var array = Array<Int>() 

DispatchQueue.concurrentPerform(iterations: 10) { (int) in 
    let last = array.last ?? 0 
    array.append(last + 1) 
    print("array = [..\(last)]") 
} 

print(array) 

DispatchQueue.concurrentPerform(iterations: 10) { (int) in 
    let last = safeArray.last ?? 0 
    safeArray.append(element: last + 1) 
     print("safeArray = [..\(last)]") 
} 

print(safeArray.elements) 

output of my code

期待できないとして働きます

アレイは3つの値を持っていますが、safeArrayの値は、期待通りです。しかし、なぜこの値は0から9までではないのですか?

ありがとうございました!

答えて

0

んあなたは取得しないだろう価値フォーム1から10 !!!、DispatchQueue.concurrentPerformの複数の操作を実行しているため、同時に

は私が

と仮定DispatchQueue.concurrentPerformが、その後、同時に3つの項目を実行します説明しましょうここをクリック

let last = safeArray.last ?? 0 

しかし、それは3回1を追加することによって、それに配列を追加することはとても

あなたの配列のようなもの[1,1,1 ...]

まだ私がクリアしていますここで、出力でバリーのない役割がありませんになる

バリアプロセスが実行中でも読者はブロックされます。すでに並列に実行されているいくつかのリーダー・ブロックがある場合でも、すべての読者はあなたが説明しDispatchSemaphore MjZacとして使うべき行動を阻止する必要がある場合、書き込み

を開始する前に完了するために、バリアプロセスが待機します

希望はあなたには明らかです

0

なぜ使用しないのですかDispatchSemaphore

import Foundation 
import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

public class SafeArray<Element> { 
    private var array = [Element]() 
    private let semaphore = DispatchSemaphore(value: 1) 
    private var lastEl: Element? 

    public func append(element: Element) { 

      self.array.append(element) 
    } 

    public var elements: [Element] { 
     var result = [Element]() 
     result = self.array 
     return result 
    } 

    public var last: Element? { 
     self.semaphore.wait() 
     lastEl = self.array.last 
     self.semaphore.signal() 
     return lastEl 
    } 
} 




var safeArray = SafeArray<Int>() 
var array = Array<Int>() 

DispatchQueue.concurrentPerform(iterations: 10) { (int) in 
    let last = array.last ?? 0 
    array.append(last + 1) 
    print("array = [..\(last)]") 
} 

print(array) 

DispatchQueue.concurrentPerform(iterations: 10) { (int) in 
    let last = safeArray.last ?? 0 
    safeArray.append(element: last + 1) 
    print("safeArray = [..\(last)]") 
} 

print(safeArray.elements) 
関連する問題