2011-11-11 6 views
0

ロックについては、わからないことが1つあります。私はhttp://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW16を読んだことがあるが、確かに分かりません。 @synchronize(または単に一般的なmutex)は、コードの一部だけを保護する(メソッド内部で)か、オブジェクト全体全体をロックしますか?ロックについての混乱

たとえば、これらのメソッドで動作する2つのスレッドは、配列を変更します。

@synthesize m_myMutableArray; 

-(void)threadA 
{ 
    @synchronized(m_myMutableArray) { 
     [m_myMutableArray removeAllObjects]; 
    } 
} 

-(void)threadB 
{ 
    NSInteger asdf = 1; 
    @synchronized(m_myMutableArray) { 
     [m_myMutableArray addObject:asdf]; 

} 

は、彼らは2つのコードの別々のブロックであるため、何もしていません@synchronized、またはそれは両方の方法でロックされている同じミューテックスで、m_myMutableArrayはスレッドセーフであることを意味しますか?

おかげ@synchronized

+0

関連:[同期されたブロックはロックを解除することが保証されていますか?](http://stackoverflow.com/q/7735799/557219)ケビンの答えはあなたの質問にも答えなければなりません。 'm_myMutableArray'が指すオブジェクトは同じです。 –

+0

[Objective-Cで@synchronizedロック/アンロックはどうすればよいですか?](http://stackoverflow.com/questions/1215330/how-does-synchronized-lock-unlock-in-objective-c) –

+0

私は私はm_myMutablearrayにアクセスしようとするたびに@synchronizedディレクティブを使用する必要がありますか?たとえば、threadBがsynchronizedディレクティブを使用していない場合、threadAがそれをロックしていたとしてもブロックされますか? – KaiserJohaan

答えて

3

「引数は」あなたが別のロックされたセクションを持つことができますので、いわゆるトークンまたはキーです。彼らは同じトークンを持っているときだけ、お互いをブロックします。オブジェクト自体は「ロック」されていません。あなたは2 @synchronized(foo)と2 @synchronized(bar)を持っている場合

だから、FOOのセクションでは、お互いをブロックしますがバーセクションをブロックしません。

可能であれば、動的な性質のため、avoid @synchronized as it's very slowにする必要があります。

+0

threadAがメインスレッドの場合は、threadBのすべての干渉操作に対してperformSelectorOnMainThreadを使用できますか? – KaiserJohaan

+0

あなたは、まったく一緒にロッキングしないようにすることを意味しますか?あなたがしたいことに応じて、これはオプションです。ただし、* waitUntilDone:YES *を設定すると、スレッドBはメインが現在の実行ループの繰り返しを終了してからセレクタを実行できるようになるまでブロックします。ほとんどの時間はロックよりも遅いです。 – DarkDust

+0

私はwaitUntillDone(ListViewのようなUI要素を更新するコールバックです)をしないといいですか? – KaiserJohaan

関連する問題