Почему я должен отдавать предпочтение тому или иному на практике? Какие технические отличия, кроме того, что std::thread
это класс?
std::thread
и
std::thread
или pthreads
нет.
Почему я должен отдавать предпочтение тому или иному на практике? Какие технические отличия, кроме того, что std::thread
это класс?
std::thread
и
std::thread
или pthreads
нет.
Ответы:
Если вы хотите запускать код на многих платформах, выберите 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
, еще не реализованы.
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
до сих пор не хватает больших частей, где в Linux std::thread
кажется достаточно зрелым.
Для меня решающим техническим отличием является отсутствие примитивов обработки сигналов в std, в отличие от pthreads. Неспособность должным образом диктовать обработку сигналов в Unix-процессе с использованием только std - это AFAIK, изнурительный недостаток в использовании std :: thread, поскольку он запрещает устанавливать добросовестный многопоточный шаблон обработки сигналов для обработки всех сигналов в выделенном нить и заблокировать их в остальном. Вы должны предположить, что std :: thread реализован с использованием pthreads, и надеяться на лучшее при использовании pthread_sigmask. Правильная обработка сигналов не подлежит обсуждению при программировании систем Unix для предприятия.
По состоянию на 2016 год std :: thread - игрушка; просто как тот.
std::thread
обеспечивает безопасность типов, которой нет в pthread.
OpenMP
является стандартизированным стандартом многопоточности на основе SMP, который работает на Linux и Windows уже более десяти лет. OpenMP доступен по умолчанию для всех компиляторов, включая GCC и Microsoft Visual Studio.
При использовании OpenMP следует обратить внимание на то, что если потоков больше, чем ядер ЦП, производительность снижается из-за накладных расходов, связанных с переключением контекста. Второе, что нужно иметь в виду, это то, что инициализация фактического потока на уровне операционной системы является относительно дорогой. Инициализация занимает доли секунды, но в некоторых приложениях очень маленькие доли накапливаются со значительными затратами.
Для параллелизма, связанного с требованиями к архитектуре программного обеспечения. Вы можете искать некоторые реализации «легких потоков» или «зеленых потоков» вместо использования OpenMP. Разница в том, что потоки OpenMP являются фактическими, уровнями операционной системы, потоками, но «зеленые потоки» могут быть просто «смоделированными потоками», которые выполняются с использованием небольшого количества реальных потоков.
std::async