2016-05-04 11 views
0

Wollen Sie versuchen, einfache Race-Bedingung zu machen und dispatch_barrier verwenden, um es zu lösen.Wenn es richtig ist, Race Condition in Swift zu tun?

Ein Zögern darüber, weil der Wert um 1000 in der Regel ein bisschen mehr ist, aber ich nehme an, dass sollte etwas größer sein, als ich auf Youtube-Videos gesehen habe.

class A { 
     var someValue = 0 

     func increaseValueBy1000() { 
     for _ in 0..<1000 { 
      let v = self.someValue + 1 
      print(v) 
      self.someValue = v 
     } 
     } 
    } 


    let instance1 = A() 



    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) { 
     instance1.increaseValueBy1000() 
    } 


    instance1.increaseValueBy1000() 

Wenn es richtige Race Condition Beispiel ist oder nicht?

+0

Ich würde 'print (v)' aus der Schleife entfernen. Wer weiß, was passiert, wenn der Druck synchronisiert wird? – werediver

+0

Aber woher weiß ich, ob ich einen falschen Wert von v erhalten habe oder nicht? –

+0

@ wm.p1us NSLog stattdessen drucken – user3441734

Antwort

1

Hier ist eine Race-Bedingung Demo:

import Foundation 

var x = 0 

func setX(y: Int) { 
    x = y 
} 

let sema = dispatch_semaphore_create(1) 
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER) 

let q = dispatch_queue_create("demo.race-condition", DISPATCH_QUEUE_CONCURRENT) 
dispatch_suspend(q) 

// Schedule a number of concurrent tasks 
for i in 0 ..< 32 { 
    dispatch_async(q) { 
     setX(i) 
    } 
} 

// Schedule a completion handler 
dispatch_barrier_async(q) { 
    print("x: \(x)") 
    dispatch_semaphore_signal(sema) 
} 

// Start running all the scheduled tasks 
dispatch_resume(q) 
// Wait until done 
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER) 

Es gibt kein richtigen Wert hier wenn Sie verstehen, was actualy passieren sollte.

+0

Ok, aber was eigentlich falsch in meinem Beispiel, wenn es keine Race Condition zeigt? –

+0

Vielleicht zeigt es, aber nicht deutlich zu demonstrieren. Dieses Beispiel zeigt deutlich den Wettlaufzustand, indem verschiedene "x" von Lauf zu Lauf gedruckt werden. – werediver

+0

Ich habe Spielplatz eingecheckt es zeigt nur 31. –

Verwandte Themen