Как прекратить поток, ожидающий @synchronized target C - PullRequest
0 голосов
/ 21 мая 2009

У меня есть такой код:

doDatabaseFetch {
   ...
   @synchronized(self) {
      ...
   }
}

и многие объекты, которые вызывают doDatabaseFetch, поскольку пользователь использует представление.

Моя проблема в том, что у меня есть операция (перейдите к следующему представлению), которая также требует выборки из базы данных. Моя проблема в том, что он попадает в тот же блок синхронизации и ждет своей очереди! В идеале мне бы хотелось, чтобы эта операция уничтожала все ожидающие потоки или давала этому потоку более высокий приоритет, чтобы он мог выполняться немедленно.

Apple говорит, что

Рекомендованный способ выхода из потока состоит в том, чтобы позволить ему нормально выйти из подпрограммы точки входа. Хотя Cocoa, POSIX и Multiprocessing Services предлагают процедуры для непосредственного уничтожения потоков, использование таких процедур настоятельно не рекомендуется.

Так что я не думаю, что должен уничтожать потоки ... но как я могу позволить им нормально завершиться, если они ожидают синхронизированный блок? Должен ли я написать свой собственный семафор, чтобы справиться с этим поведением?

Спасибо! Ник.

Ответы [ 2 ]

3 голосов
/ 21 мая 2009

Первый вопрос, который нужно задать здесь - вам нужен такой большой критический раздел, в котором так много потоков ожидают входа? Здесь вы делаете сериализацию параллельного выполнения, то есть снова делаете вашу программу однопоточной (но медленнее). Максимально уменьшайте объем блокировки, подумайте об уменьшении конкуренции на уровне приложений, используйте соответствующие инструменты синхронизации (ожидание / сигнал) - вы обнаружите, что вам не нужно убивать темы, почти всегда. Я знаю, что это очень общий совет, но он действительно помогает так думать.

2 голосов
/ 21 мая 2009

Как правило, вы не можете завершить поток, который ожидает синхронизированный блок, если вам нужно такое поведение, вы должны использовать временную парадигму ожидания и сигнала, чтобы потоки находились в состоянии ожидания звука и могли быть прерваны. Кроме того, если вы используете временную парадигму ожидания и сигнала, каждый раз, когда истекает время ожидания, ваши потоки имеют возможность не возвращаться в спящий режим, а выходить или идти по другому пути (т. Е. Даже если вы не решите прекратить их ).

Синхронизированные блоки предназначены для неоспоримых блокировок, при неоспоримых блокировках синхронизация должна быть довольно близка к noop, но как только блокировка становится оспариваемой, они очень сильно влияют на производительность приложения, причем даже не просто потому, что они блокируются. сериализация вашей параллельной программы.

Я ни в коем случае не эксперт Objective C, но я уверен, что есть некоторые более продвинутые шаблоны синхронизации, такие как барьеры, условия, атомика и т. Д.

...