Как избежать тупика на @synchronized (self)? - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть синхронизация в моем проекте Objective-C.Код выглядит так:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    //some code
    @synchronized(self) {    //at this line deadlocks
        //some code
    }
    //some code
}

и в этой строке (@synchronized) всегда возникает тупик.Я также могу сказать, что этот метод делегата вызывается очень часто.

Как избежать таких тупиков?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

Это означает, что ваша блокировка из другого потока никогда не снимает блокировку, полученную @synchronized(self) - вы, вероятно, ожидаете, пока что-то завершится, что происходит в другом потоке, пытаясь получить доступ к блокировке, пока она удерживается из другой точки.Ищите эту проблему (если вы сделаете паузу, вы, вероятно, увидите ожидание в отладчике в другом потоке).Это также предполагает, что ваши блокировки хранятся в течение длительных периодов - удерживайте их только в течение коротких периодов, если вы хотите эффективно использовать параллелизм.

3 голосов
/ 23 февраля 2012

Тебе стоит пересмотреть дизайн своих занятий.Этого не должно быть.Если это произойдет, посмотрите на любые критические разделы (synchronized ()), которые блокируют экземпляр.Один из них навсегда заблокирует ваш экземпляр.Или, может быть, у вас есть перекрестная блокировка (метод M1 блокирует A, а метод M2 блокирует B, и они хотят поменять блокировку одновременно), это вызывает тупик.

...