Почему я должен отдавать предпочтение тому или иному на практике? Какие технические отличия, кроме того, что std::thread
это класс?
c++
multithreading
c++11
pthreads
Shamdor
источник
источник
std::async
std::thread
иstd::thread
илиpthreads
нет.Ответы:
Если вы хотите запускать код на многих платформах, выберите Posix Threads. Они доступны практически везде и являются достаточно зрелыми. С другой стороны, если вы используете только Linux / gcc,
std::thread
это прекрасно - у него более высокий уровень абстракции, действительно хороший интерфейс и он прекрасно работает с другими классами C ++ 11.К
std::thread
сожалению, класс C ++ 11 не работает надежно (пока) на всех платформах, даже если C ++ 11 кажется доступным. Например, в родном Androidstd::thread
или Win64 он просто не работает или имеет серьезные узкие места в производительности (по состоянию на 2012 год).Хорошая замена
boost::thread
- это очень похоже наstd::thread
(на самом деле это от того же автора) и работает надежно, но, конечно, он вводит другую зависимость от сторонней библиотеки.Редактировать: С 2017 года в
std::thread
основном работает на родном Android. Некоторые классы, подобныеstd::timed_mutex
, еще не реализованы.источник
std::thread
и его raii-стиль хорош, потому что он может обрабатывать исключения C ++, в то время как pthreads не может быть из коробки.std::thread
Библиотека реализуется на вершине Pthreads в окружающей среде , поддерживая Pthreads (например: libstdc ++).Я думаю, что большая разница между ними - абстракция.
std::thread
библиотека классов C ++std::thread
Библиотека включает в себя множество абстрактных функций, например: контекстными замки, рекурсивные мьютексы, будущее / обещание реализации шаблон дизайна и многое другое.источник
+1
от меня за то, что я указал на самую важную вещь, а именно на то, что std :: thread обеспечивает более высокий уровень абстракции.std::thread
обеспечивает переносимость между различными платформами, такими как Windows, MacOS и Linux.Как упомянуто @hirshhornsalz в комментариях ниже и связанном с этим ответе https://stackoverflow.com/a/13135425/1158895 ,
std::thread
может быть неполным на всех платформах. Тем не менее, (это будет в ближайшем будущем), его следует отдавать предпочтениеpthread
, потому что оно должно сделать ваше приложение более перспективным.источник
boost::thread
на Win64 или Bionic (Android), потому чтоstd::thread
до сих пор не хватает больших частей, где в Linuxstd::thread
кажется достаточно зрелым.Для меня решающим техническим отличием является отсутствие примитивов обработки сигналов в std, в отличие от pthreads. Неспособность должным образом диктовать обработку сигналов в Unix-процессе с использованием только std - это AFAIK, изнурительный недостаток в использовании std :: thread, поскольку он запрещает устанавливать добросовестный многопоточный шаблон обработки сигналов для обработки всех сигналов в выделенном нить и заблокировать их в остальном. Вы должны предположить, что std :: thread реализован с использованием pthreads, и надеяться на лучшее при использовании pthread_sigmask. Правильная обработка сигналов не подлежит обсуждению при программировании систем Unix для предприятия.
По состоянию на 2016 год std :: thread - игрушка; просто как тот.
источник
std::thread
обеспечивает безопасность типов, которой нет в pthread.OpenMP
http://www.openmp.org/
является стандартизированным стандартом многопоточности на основе SMP, который работает на Linux и Windows уже более десяти лет. OpenMP доступен по умолчанию для всех компиляторов, включая GCC и Microsoft Visual Studio.
При использовании OpenMP следует обратить внимание на то, что если потоков больше, чем ядер ЦП, производительность снижается из-за накладных расходов, связанных с переключением контекста. Второе, что нужно иметь в виду, это то, что инициализация фактического потока на уровне операционной системы является относительно дорогой. Инициализация занимает доли секунды, но в некоторых приложениях очень маленькие доли накапливаются со значительными затратами.
Для параллелизма, связанного с требованиями к архитектуре программного обеспечения. Вы можете искать некоторые реализации «легких потоков» или «зеленых потоков» вместо использования OpenMP. Разница в том, что потоки OpenMP являются фактическими, уровнями операционной системы, потоками, но «зеленые потоки» могут быть просто «смоделированными потоками», которые выполняются с использованием небольшого количества реальных потоков.
источник