2016-05-04 13 views
0

単純な競合状態を作り、それを解決するためにdispatch_barrierを使用したい。速やかに競合状態をするのが正しいのですか?

私はYouTubeのビデオで見たように値が通常はもう少し1000程度だから、それは躊躇しています。

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() 

正しい競合条件の例ですか?ここで

+0

私は 'print(v)'をループから削除します。誰が知っている、何が印刷されている場合は? – werediver

+0

しかし、vの値が間違っているかどうかはどうやって分かりますか? –

+0

@ wm.p1us代わりにNSLogを使用してください – user3441734

答えて

1

は、競合状態のデモです:

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) 

あなたはactualyが起こるべきかを理解場合右の値がここにありません。

+0

しかし、競合状態が表示されていない場合は、私の例で実際に間違っていますか? –

+0

おそらくそれは表示されますが、明確に示されていません。この例では、実行時に異なる 'x'を出力することによって、競合状態を明確に示しています。 – werediver

+0

私は遊び場にチェックインしたのはわずか31です。 –