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

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

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

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

Ответы [ 14 ]

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

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

Но, с другой стороны, синхронизировать 1000 потоков без проблем с блокировками гораздо сложнее, чем когда их всего 2.

Реальный ответ - синхронизация потоков сложна по-разному, и точка.«

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

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

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

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

В одном из интервью я бы сказал, что «ровно две нити» - это очень полезный частный случай многопоточности.Такие вещи, как голодание и инверсия приоритетов, могут происходить всего с тремя потоками, но только с двумя потоками инверсия приоритетов и голодание могут никогда не произойти (ну, голодание может произойти, если поток освободил и повторно захватил блокировку, не позволяя запустить другой поток, но сможет произойти голодание трех нитей, даже если блокировки доступны сразу же, когда они доступны).Переход с 2-х потоков на 3 - это больший прыжок, чем с 3-х до 1000-х.

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

У меня есть два ответа.

  1. ПРИМЕР 1: Использовать существующие ресурсы: Синхронизация 2 потоков такая же сложность, как синхронизация 1000 потоков, поскольку существующие создаются для синхронизации произвольного числапотоков.
  2. ПРИМЕР 2: Внедрение с нуля Кажется очевидным, что если бы вам пришлось реализовать систему синхронизации с нуля, то было бы проще создать двухпоточную систему.
3 голосов
/ 29 июля 2010

Зависит от того, что значит «проще».Сложность механизмов проектирования / блокировки примерно одинакова.

Тем не менее, я думаю, что 1000 потоковых программ проще отладить .Уязвимые расовые условия имеют более высокую вероятность возникновения и, вероятно, их будет легче воспроизвести.Состояние гонки в двух потоках может появляться только раз в 5 лет, если луна полная и вы в отпуске.

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

Я думаю, что ответ таков: после синхронизации двух потоков все остальные 998 также будут синхронизированы

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

Почему синхронизация 1000 потоков будет сложнее, чем синхронизация 2 потоков?

Единственный код, который будет добавлен, будет вызывать дополнительные потоки.

Вам не нужно было бы добавлять код синхронизации (если вы все делали правильно).

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

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

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

1 голос
/ 03 августа 2010

Просматривая ваши ответы, я обнаружил несколько интересных моментов. Я думаю, на собеседовании это важнее, чем ответ: обращение, трудности.

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

Я бы согласился с тем, что "это зависит". Если потоки идентичны, то не должно быть такой большой разницы между 2 и 1000 нитями. Однако, если существует несколько ресурсов, которым требуется взаимоисключающий доступ (синхронизированный в терминах Java), вероятность взаимоблокировок может возрасти с увеличением количества потоков.

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