2016-08-13 5 views
5

मुझे यकीन नहीं है कि यह xcode8 बीटा 5 में तोड़ दिया गया है। इस कोड को देखें। क्या आपको लगता है कि इसे पहले "ए" प्रिंट करना चाहिए, या "बी" पहले?क्या समवर्ती कतार पर `.barrier` तुरंत सक्रिय होना चाहिए?

let q = DispatchQueue(label: "q", attributes: .concurrent) 
q.async(flags: .barrier) { 
    Thread.sleep(forTimeInterval: 0.25) 
    print("A") 
} 
q.sync { 
    print("B") 
} 
.barrier की वजह से

, मुझे लगता है कि यह समवर्ती कतार और प्रिंट 'ए', 'बी' ब्लॉक करना चाहिए, लेकिन यह नवीनतम xcode बीटा में नहीं है।

बग? बाधा की गलतफहमी? तुम क्या सोचते हो?

कृपया ध्यान दें: मुझे पता है कि अगर मैं एक धारावाहिक कतार का उपयोग करता हूं तो यह अपेक्षित क्रम में प्रिंट करेगा - यह एक बहुत बड़ी प्रणाली का एक छोटा सा हिस्सा है और मुझे इस व्यवहार को अलगाव में समझने की आवश्यकता है।

उत्तर

5

यह एक बग बीटा 6.

में तय बीटा 5 में था, न केवल यह जिस तरह से आप उम्मीद थी व्यवहार नहीं करता है, लेकिन .onQueueAsBarrier पूर्व शर्त विफल रहता है, भी। समस्या, .barrier विकल्प के साथ async में दफन होना दिखाई देते हैं होगा क्योंकि अगर आप इसे बराबर ऑब्जेक्टिव-सी एपीआई, dispatch_barrier_async के माध्यम से करते हैं, तो यह ठीक काम करता है, जैसे:

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") 
} 

कहाँ

@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

के लिए धन्यवाद ओबीजेसी तुलना! मैंने इसे स्विफ्ट टीम के साथ दायर किया: https://bugs.swift.org/browse/SR-2335 मैं ऐप्पल की बजाय उस प्लेटफॉर्म की पारदर्शिता से प्रभावित हूं। हो सकता है कि यह कोड ऐप्पल के स्वामित्व में है? मेरे लिए बताना मुश्किल है। – SimplGy

संबंधित मुद्दे