Оценка риска: использование Pthreads (против GCD или NSThread)


Недавно коллега предложил мне использовать pthreads вместо GCD, потому что это "намного быстрее."Я не возражаю, что это быстрее, но каков Риск с pthreads?

Мое чувство таково, что они в конечном счете не будут нигде столь же устойчивы к идиотизму, как GCD (а моя команда из одного-50% идиотов). Птхреды трудно получить правильно?

4 7

4 ответа:

GCD и pthreads-это оба способа выполнения работы асинхронно, но они существенно отличаются. Большинство описаний GCD описывают его в терминах потоков и объединения потоков, но, как говорит DrPizza

Концентрироваться на [потоках и пулах потоков] - значит упускать суть. Значение GCD заключается не в объединении потоков, а в очереди.
                                                                Grand Central Dispatch для Win32: почему я хочу это

GCD имеет некоторые приятные преимущества перед API, такими как pthreads.

  • GCD делает больше для поощрения и поддержки "островов сериализации в море параллелизма"."GCD позволяет легко избежать множества блокировок, мьютексов и переменных условий, которые являются нормальным способом связи между потоками. Это происходит потому, что вы разлагаете свою программу на задачи и GCD обрабатывает получение ввода и вывода задачи в соответствующий поток за кулисами. Поэтому программирование с помощью GCD вы можете в значительной степени писать последовательно и не слишком беспокоиться о вещах, которые часто беспокоят людей в потоковом коде. Это делает код проще и менее подверженным ошибкам.

  • GCD может выполнять масштабирование для вас, поэтому программа использует столько параллелизма, сколько позволяют зависимости между задачами, в которые вы разложили свою программу, и оборудованием. Конечно, разработка масштабируемой программы, как правило, является трудным делом, но вам все равно нужно что-то взять на себя преимущество этой работы в том, чтобы работать как можно больше параллельно. Работа краже планировщики НОД, как это делается.

  • GCD является составным. Если вы явно создаете потоки для вещей, которые вы хотите делать асинхронно или параллельно, вы можете столкнуться с проблемой, когда библиотеки, которые вы используете, делают то же самое. Предположим, вы решили, что можете запускать восемь потоков одновременно, потому что именно столько потоков будет эффективно для вашей программы, учитывая машину, на которой она работает. А потом сказать библиотека, которую вы используете на каждая нить делает то же самое. Теперь вы можете иметь до 64 потоков, работающих одновременно, что больше, чем вы знаете, эффективно для вашей программы.

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

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

Я не думаю, что их трудно правильно понять, но на протяжении многих лет я работал со многими различными подходами (pthreads, GCD, NSThread, NSOperationQueue и т. д.) У меня нет доказательств, подтверждающих утверждение типа " pthreads намного быстрее."Даже если бы они были быстрее (и я ожидал бы, что разница будет в лучшем случае незначительной), я всегда говорю: "используйте абстракцию высшего уровня, которая выполняет работу.-Кроме того, избегайте преждевременной оптимизации.

Анекдотически говоря, GCD довольно чертовски быстро . Как я это вижу, мобильность является основным преимуществом компиляции НОД. Если это эксклюзивный код OSX / iOS, я не вижу никаких преимуществ в использовании pthreads, если нет эмпирических доказательств обратного.

Игнорируйте другие хорошо продуманные технические причины, потому чтоони не релевантны . Вы ведь не пишете программное обеспечение для бенчмарка, не так ли? В какой-то момент пользователь собирается сесть перед вашим устройством и попытаться использовать его. И знаете ли вы, что произойдет, если вы используете pthreads вместо GCD? Что происходит, так это то, что ваше программное обеспечение не масштабируется хорошо в присутствии другого программного обеспечения многозадачности в то же время , потому что он собирается бороться за процессор, предполагая, что это единственное программное обеспечение, работающее одновременно. И это безумие. Никто больше не запускает ОС с одной задачей. Даже одиночная задача iOS выполняет много вещей в фоновом режиме.

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

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

Вероятно, NSThread реализован с помощью библиотеки pthreads, дело в том, что чем ниже уровень концепции, тем больше вам приходится делать бесполезных и повторяющихся задач.

Так что библиотека pthreads не так уж и сложна для изучения