Путаница с замками - PullRequest
       21

Путаница с замками

0 голосов
/ 11 ноября 2011

Есть одна вещь, в которой я не уверен, когда дело доходит до замков. Я прочитал http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW16, но в одном я не уверен; @synchronize (или просто мьютекс в целом) защищает только часть кода (скажем, внутри метода) или блокирует весь объект в целом?

Например, над этими методами работают два потока, которые модифицируют массив;

@synthesize m_myMutableArray;

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

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

}

Разве @synchronized ничего не делает, потому что они являются двумя отдельными блоками кода, или это один и тот же мьютекс, блокируемый в обоих методах, то есть m_myMutableArray является потокобезопасным?

Спасибо

1 Ответ

3 голосов
/ 11 ноября 2011

«Аргумент» для @synchronized - это так называемый токен или ключ, позволяющий иметь разные заблокированные секции.Они блокируют друг друга только тогда, когда имеют одинаковый токен.Сами объекты не «заблокированы».

Так что, если у вас есть две @synchronized(foo) и две @synchronized(bar), секции foo блокируют друг друга, но не блокируют полосу секции.

Если возможно, вам следует избегать @synchronized, поскольку он очень медленный из-за его динамического характера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...