Почему я должен предпочесть тот или иной на практике?
Каковы технические отличия, за исключением того, что std::thread
является классом?
С++ 11 std:: threads vs posix threads
Ответ 1
Если вы хотите запускать код на многих платформах, перейдите на разделы Posix Threads. Они доступны почти везде и довольно зрелые. С другой стороны, если вы используете только Linux/gcc std::thread
, это отлично - он имеет более высокий уровень абстракции, действительно хороший интерфейс и отлично сочетается с другими классами С++ 11.
Класс С++ 11 std::thread
к сожалению не работает надежно (пока) на каждой платформе, даже если С++ 11 кажется доступным. Например, на родном Android std::thread
или Win64 он просто не работает или имеет серьезные узкие места в производительности (с 2012 года).
Хорошая замена - boost::thread
- она очень похожа на std::thread
(на самом деле она от одного и того же автора) и работает надежно, но, конечно же, она вводит другую зависимость от сторонней библиотеки.
Изменить: с 2017 года std::thread
в основном работает на родном Android. Некоторые классы, такие как std::timed_mutex
, все еще не реализованы.
Ответ 2
Библиотека std::thread
реализована поверх pthreads в среде, поддерживающей pthreads (например: libstdС++).
Я думаю, что большая разница между ними - это абстракция. std::thread
- это библиотека классов С++. Библиотека std::thread
включает в себя множество абстрактных функций, например: локальные блокировки, рекурсивные мьютексы, будущие/перспективные варианты реализации шаблонов и т.д.
Ответ 3
std::thread
обеспечивает переносимость на разных платформах, таких как Windows, MacOS и Linux.
Как упоминалось @hirshhornsalz в комментариях ниже и соответствующем ответе fooobar.com/questions/58790/..., std::thread
может быть не полным на всех платформах. Даже в любом случае (это будет в ближайшем будущем), он должен быть лучше pthread
, потому что он должен сделать ваше приложение более надежным для будущего.
Ответ 4
Для меня решающим техническим отличием является отсутствие примитивов обработки сигналов в std, а не pthreads. Неспособность правильно диктовать обработку сигналов в процессе Unix с использованием только std - это AFAIK, изнурительный недостаток в использовании std:: thread, поскольку он препятствует настройке шаблона обработки сигналов с несколькими многопоточными сигналами для обработки всех сигналов в выделенном нить и блокировать их в остальном. Вы вынуждены предположить, что std:: thread реализован с использованием pthreads и надеется на лучшее при использовании pthread_sigmask. Правильно обрабатывать сигналы не подлежит обсуждению в программном обеспечении Unix для предприятия.
Как и в 2016 году, std:: thread - игрушка; просто как это.
Ответ 5
OpenMP
- стандартизованный стандарт многопоточности на основе SMP, который уже более десяти лет работает над Linux и Windows. OpenMP доступен по умолчанию со всеми компиляторами, включая GCC и Microsoft Visual Studio.
Одна вещь, которую следует учитывать при использовании OpenMP, заключается в том, что если есть больше потоков, чем есть CPU-ядра, тогда производительность будет снижаться из-за связанных с переключением контекста затрат. Второе, что нужно иметь в виду, это то, что инициализация фактического уровня операционной системы, потока относительно дорога. Инициализация - это часть секунды, но в некоторых приложениях очень мелкие фракции накапливаются до значительные расходы.
Требования к архитектуре программного обеспечения, связанные с concurrency Возможно, вы захотите выполнить некоторую реализацию "легких потоков" или "зеленых потоков" вместо использования OpenMP. Разница в том, что потоки OpenMP являются фактическими, уровень операционной системы, потоки, но "зеленые потоки" могут быть просто "имитируемыми потоками", которые выполняются с использованием небольшого количества реальных потоков.