2016-08-13 2 views
5

Ich bin mir nicht sicher, ob das xcode8 Beta 5 einbrach. Schau dir diesen Code an. Denkst du, es sollte zuerst "A" oder "B" drucken?Sollte eine `.barrier` in einer gleichzeitigen Queue sofort aktiv werden?

let q = DispatchQueue(label: "q", attributes: .concurrent) 
q.async(flags: .barrier) { 
    Thread.sleep(forTimeInterval: 0.25) 
    print("A") 
} 
q.sync { 
    print("B") 
} 

Wegen der .barrier, ich denke, es sollte die gleichzeitige Warteschlange und Druck von „A“, „B“ Block, aber es funktioniert nicht in der neuesten Xcode Beta.

Fehler? Missverständnis von .barrier? Was denken Sie?

Bitte beachten Sie: Ich weiß, dass dies in der erwarteten Reihenfolge gedruckt werden würde, wenn ich eine serielle Warteschlange verwenden würde - dies ist ein winziger Teil eines viel größeren Systems und ich muss dieses Verhalten isoliert verstehen.

Antwort

5

Dies war ein in der Beta-Fehler behoben 6.

In Beta 5, nicht nur, dass es die Art und Weise nicht so verhalten, man erwarten würde, aber die .onQueueAsBarrier Voraussetzung nicht, auch. Das Problem scheint in async mit der .barrier Option begraben zu werden, denn wenn man es über gleichwertigen Objective-C-API durchführt, dispatch_barrier_async, es funktioniert gut, zum Beispiel:

let q = DispatchQueue(label: "q", attributes: .concurrent) 

BarrierExperiment.dispatchBarrierAsync(q) { 
    dispatchPrecondition(condition: .onQueueAsBarrier(q)) 
    Thread.sleep(forTimeInterval: 0.25) 
    print("A") 
} 

q.async() { 
    print("B") 
} 

Wo

@interface BarrierExperiment : NSObject 

+ (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block; 

@end 

@implementation BarrierExperiment 

+ (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block { 
    dispatch_barrier_async(queue, block); 
} 

@end 
+1

Vielen Dank für der ObjC Vergleich! Ich habe es mit dem Swift-Team eingereicht: https://bugs.swift.org/browse/SR-2335 Ich bin von der Transparenz dieser Plattform beeindruckt und nicht von der von Apple. Vielleicht gehört dieser Code aber Apple? Es ist schwer für mich zu sagen. – SimplGy

Verwandte Themen