Подтвердить что ты не робот

С++ 11 std:: threads vs posix threads

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

4b9b3361

Ответ 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

http://www.openmp.org/

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

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

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