Есть ли кросс-платформенная библиотека потоков в С++?
Я ищу простую в использовании кросс-платформенную библиотеку потоков, написанную на С++.
Как вы относитесь к boost::thread
или Pthreads
?
Работает ли Pthreads только на совместимых с POSIX системах?
Как насчет поддержки потоков в библиотеке Qt
?
Ответы
Ответ 1
Boost.Thread - это проект для следующей стандартной библиотеки потоков на языке С++. Зная это, я предпочитаю использовать его, поскольку он дает некоторые сильные гарантии (потому что он становится стандартным).
Обновление: теперь, когда у нас есть стандартные библиотеки потоков, есть еще несколько исправлений. Некоторые форсированные конструкции, такие как boost:: shared_mutex, не были стандартизированы (но могут быть позже). Однако в стандартной библиотеке лучше использовать семантику перемещения. Полезно знать, прежде чем выбирать библиотеку. Кроме того, при использовании библиотеки потоковой передачи С++ 11 требуется компилятор, который ее предоставляет. Сегодня это не так для всех компиляторов.
Обновление:
Теперь [Nov2012] большинство стандартных компиляторов предоставляют библиотеку потоков С++ 11. VS2012, GCC4.8 и Clang3.1 имеют поддержку потоков и примитивов синхронизации и атомных операций.
Для полной реализации вы также можете использовать только поток Энтони Уильямса. Это совместимая с С++ 11 библиотека, поддерживаемая в Windows/Mac и Linux.
Ссылки для статуса функций С++ 11 с различными компиляторами:
Ответ 2
Существует библиотека потоков, которая поставляется с С++ 11. Он был основан на библиотеке потоковой передачи. К сожалению, я, похоже, помню, что между Boost.Threads и С++ 11 есть нетривиальные различия. Тем не менее, если вы планируете перейти на стандартную библиотеку потоков С++, я считаю, что Boost.Threads является самым близким к вам.
Я полагаю, что под капотом эти библиотеки будут использовать Pthreads на POSIX-системах, и всякая встроенная поддержка потоков доступна в другом месте.
Отказ от ответственности: я не работал ни с одним из двух.
Ответ 3
Pthreads
работают только в системах POSIX. QThread
от Qt
- это путь. Он доступен на платформах: Linux, Mac OS X, Windows, Embedded Linux, Windows CE, Symbian, Maemo.
Ответ 4
Также посмотрите OpenMP, это набор (несколько стандартных) pragma
спецификаций, поддерживаемый большинство основных компиляторов. Хороший результат OpenMP заключается в том, что он прост и ваш код можно легко скомпилировать как в однопользовательских, так и в многопоточных версиях.
Простой пример:
std::vector<double> a, b;
...
double sum = 0.0;
...
#pragma omp parallel for reduction(+:sum)
for (i=0; i < n; i++)
sum = sum + (a[i] * b[i]);
Очевидно, что можно сделать больше complex вещи.
Ответ 5
Я удивлен, что никто не упоминал библиотеку Intel TBB (связанный с другим моим ответом). Кроме того, рекомендуется использовать задачу на основе задач в потоковом режиме.
Ответ 6
Qt имеет неплохую поддержку потоков. Если вам просто нужно создать поток и запустить в нем некоторый код, QThread
- это все, что вам нужно. Существует много других классов высокого уровня, которые могут помочь вам в пулах потоков или даже абстрагировать параллельное выполнение (инфраструктура QtConcurrent).
Ответ 7
Перечислите соответствующие платформы. Если вы используете, скажем, Linux/Mac/Windows, то boost:: thread, скорее всего, сделает вас хорошо, пока С++ 0x (harhar) не предоставит std:: thread.
Ответ 8
Я использовал pthreads для кода, который работает на нескольких платформах. Чтобы обойти Windows недостаток pthreads, я использовал следующую библиотеку с открытым исходным кодом с большим успехом: POSIX Threads для Windows
Ответ 9
wxWidgets имеет классы потоков, а поскольку wxWidgets независим от платформы, это может быть просто лучше для u.
Ответ 10
Boost.Threads построен поверх PThreads в системах UNIX и потоках Win32 в Windows.
Библиотека ускорения синтаксически проста, и весь волосатый бизнес правильно взаимодействующего кода на С++ с библиотеками C позаботится об этом за кулисами. Если вам не очень нравится С++, PThreads может показаться более простым с его простым API C.
Qt Threads также является хорошей библиотекой, но поскольку я использую несколько других библиотек boost, я буду компилировать и связывать с Boost независимо от того, что. Я не всегда могу ссылаться на Qt. И, ну, я просто не хочу вспоминать, как использовать две разные библиотеки.
Ответ 11
SDL прост, кросс-платформенный и поддерживает потоки.
Ответ 12
Pthread является частью Posix, но не каждая система posix будет иметь потоки. pthreads наиболее портативен.
Какие платформы вы будете поддерживать?