C ++ 11 std :: threads против потоков posix

157

Почему я должен отдавать предпочтение тому или иному на практике? Какие технические отличия, кроме того, что std::threadэто класс?

Shamdor
источник
5
На практике вы должны использоватьstd::async
Стефан Dollberg
@bamboon Это страдает от тех же проблем, что std::threadи
Гюнтер Пиз
2
@hirschhornsalz с точки зрения поддержки компилятора, да. с технической точки зрения это предлагает исключительную безопасность, которая std::threadили pthreadsнет.
Стефан Доллберг
15
Проголосовал за открытие. Запрос о «технических различиях» делает это объективно ответственным. Большое количество голосов указывает на то, что другие сочли этот пост конструктивным и полезным.
Эдриан Маккарти
stackoverflow.com/questions/1273572/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

122

Если вы хотите запускать код на многих платформах, выберите Posix Threads. Они доступны практически везде и являются достаточно зрелыми. С другой стороны, если вы используете только Linux / gcc, std::threadэто прекрасно - у него более высокий уровень абстракции, действительно хороший интерфейс и он прекрасно работает с другими классами C ++ 11.

К std::threadсожалению, класс C ++ 11 не работает надежно (пока) на всех платформах, даже если C ++ 11 кажется доступным. Например, в родном Android std::threadили Win64 он просто не работает или имеет серьезные узкие места в производительности (по состоянию на 2012 год).

Хорошая замена boost::thread- это очень похоже на std::thread(на самом деле это от того же автора) и работает надежно, но, конечно, он вводит другую зависимость от сторонней библиотеки.


Редактировать: С 2017 года в std::threadосновном работает на родном Android. Некоторые классы, подобные std::timed_mutex, еще не реализованы.

Гюнтер Пьез
источник
19
Есть ли у вас доказательства, подтверждающие эти утверждения о «узких местах»? Кроме того, std::threadи его raii-стиль хорош, потому что он может обрабатывать исключения C ++, в то время как pthreads не может быть из коробки.
Джесси Гуд
9
В 2014 году этот ответ остается в силе?
чувств
25
А сейчас, начало 2017 года?
rmobis
9
Как насчет сейчас, в середине 2017 года?
Гонки
14
Как насчет сейчас, в 2018 году среднего?
力 力
59

std::threadБиблиотека реализуется на вершине Pthreads в окружающей среде , поддерживая Pthreads (например: libstdc ++).

Я думаю, что большая разница между ними - абстракция. std::threadбиблиотека классов C ++ std::threadБиблиотека включает в себя множество абстрактных функций, например: контекстными замки, рекурсивные мьютексы, будущее / обещание реализации шаблон дизайна и многое другое.

Акира Такахаши
источник
4
+1от меня за то, что я указал на самую важную вещь, а именно на то, что std :: thread обеспечивает более высокий уровень абстракции.
ВОО
33

std::thread обеспечивает переносимость между различными платформами, такими как Windows, MacOS и Linux.

Как упомянуто @hirshhornsalz в комментариях ниже и связанном с этим ответе https://stackoverflow.com/a/13135425/1158895 , std::threadможет быть неполным на всех платформах. Тем не менее, (это будет в ближайшем будущем), его следует отдавать предпочтение pthread, потому что оно должно сделать ваше приложение более перспективным.

Brady
источник
2
фактически std :: threads обеспечивает переносимость на все платформы, поддерживающие C ++ 11, тогда как потоки POSIX доступны только на платформах POSIX (или платформах, которые стремятся к минимальной совместимости).
Тобиас Лангнер
1
С практической точки зрения это просто неправильно. Я на самом деле решил несколько месяцев назад об этом рассуждении - это была большая ошибка. На практике вы должны использовать boost::threadна Win64 или Bionic (Android), потому что std::threadдо сих пор не хватает больших частей, где в Linux std::threadкажется достаточно зрелым.
Гюнтер Пьез
1
@hirschhornsalz, смысл моего ответа - указать на преимущество переносимости, обеспечиваемое реализацией потока c ++ 11, по сравнению с pthread. ОП не спрашивал о повышении, но также и портативен.
Брейди
3
@hirschhornsalz, что касается вашего отрицательного тона и обвинения в том, что вы никогда не используете темы, они просто неконструктивны и не заслуживают больших усилий с моей стороны. Я думаю, что стоит хотя бы упомянуть, что более конструктивным комментарием было бы указать на проблемы, с которыми вы пытались использовать std :: thread на разных платформах.
Брейди
3
Подводя итог, c ++ 11 std :: thread может использоваться только с последними версиями GCC. В Visual Studio он почти не завершен, поэтому не может использоваться в Windows. И, конечно же, он абсолютно отсутствует в коммерческих компиляторах под UNIX (Sun Studio на Solaris, HP aCC на HP-UX, IBM vacpp на AIX). Поэтому, если вашей целевой платформой является только Linux - c ++ 11 std :: thread - это нормально; если вам также нужна Windows или другая UNIX - лучше использовать boost :: thread.
vond
7

Для меня решающим техническим отличием является отсутствие примитивов обработки сигналов в std, в отличие от pthreads. Неспособность должным образом диктовать обработку сигналов в Unix-процессе с использованием только std - это AFAIK, изнурительный недостаток в использовании std :: thread, поскольку он запрещает устанавливать добросовестный многопоточный шаблон обработки сигналов для обработки всех сигналов в выделенном нить и заблокировать их в остальном. Вы должны предположить, что std :: thread реализован с использованием pthreads, и надеяться на лучшее при использовании pthread_sigmask. Правильная обработка сигналов не подлежит обсуждению при программировании систем Unix для предприятия.

По состоянию на 2016 год std :: thread - игрушка; просто как тот.

Waslap
источник
7
Я не согласен. А интенсивное использование сигналов - это шаблон проектирования, которого можно избежать для большинства приложений.
Эрик Алапяя,
Кроме того, std::threadобеспечивает безопасность типов, которой нет в pthread.
AlfC
-3

OpenMP

http://www.openmp.org/

является стандартизированным стандартом многопоточности на основе SMP, который работает на Linux и Windows уже более десяти лет. OpenMP доступен по умолчанию для всех компиляторов, включая GCC и Microsoft Visual Studio.

При использовании OpenMP следует обратить внимание на то, что если потоков больше, чем ядер ЦП, производительность снижается из-за накладных расходов, связанных с переключением контекста. Второе, что нужно иметь в виду, это то, что инициализация фактического потока на уровне операционной системы является относительно дорогой. Инициализация занимает доли секунды, но в некоторых приложениях очень маленькие доли накапливаются со значительными затратами.

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

Мартин Вахи
источник
6
Неуважение, но как это связано с основным вопросом?
SRG