Что сложнее, синхронизировать 2 потока или 1000 потоков? - PullRequest
11 голосов
/ 29 июля 2010

На презентации Пола Тимы я нашел вопрос для интервью:

Что сложнее, синхронизировать 2 потока или синхронизировать 1000 потоков?

Отмоя точка зрения, конечно, синхронизировать 1000 потоков сложнее, но я не могу придумать веских причин для этого, кроме «конечно».Но поскольку это вопрос для собеседования , может быть, я ошибаюсь (вопросы на собеседовании должны быть хитрыми, не так ли?).

Ответы [ 14 ]

1 голос
/ 29 июля 2010

Это один из тех вопросов, на который единственный реальный ответ - «это зависит».В этом случае это зависит от того, что вы делаете с ними.

Сценарий может быть таким же простым, как отдельный фоновый рабочий поток, которого ждет передний план при отображении индикатора выполнения.Или же он может порождать 1000 потоков и просто ждать завершения всех из них, прежде чем делать что-то еще.

В качестве альтернативы, если всего 2 потока получают доступ к общим ресурсам, тогда концепции одинаковы.Вы должны быть очень осторожны с проблемами параллелизма и стратегиями блокировки, будь то 2 или 1000. Независимо от того, сколько потоков больше одного, вы не можете гарантировать, что что-то еще не будет пытаться одновременно читать или записывать на тот же ресурс, что и вы..

0 голосов
/ 29 июля 2010

Если вы используете такой язык программирования, как Scala, с шаблоном дизайна Actors, вам не нужно ничего синхронизировать.http://www.scala -lang.org / node / 242

Другой вариант (в Java) - использовать механизм сравнения и замены / установки http://en.wikipedia.org/wiki/Compare-and-swap, так что вы делаетене нужно синхронизировать какие-либо потоки в том смысле, что они являются атомарной переменной, которую вы сравниваете и читаете (не блокируете), а только блокируете / ждете при записи, что может принести вам огромный прирост производительности на основе вашего решения

0 голосов
/ 29 июля 2010

Объекты синхронизируются не потоками.Создание синхронизированного метода или блока кода предотвращает одновременное выполнение региона несколькими потоками, поэтому не имеет значения, существует ли 2, 1 000 или 1 000 000 потоков.

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

0 голосов
/ 29 июля 2010

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

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