Я ищу некоторую простую в использовании межплатформенную библиотеку поточной обработки, записанную в C++.
О чем Ваше мнение boost::thread
или Pthreads
? Pthreads выполняет только на POSIX совместимые системы?
Что относительно поточной обработки поддерживают в Qt
библиотека?
Boost.Thread - это черновик будущей стандартной библиотеки потоковой передачи языка C ++. Зная это, я предпочитаю использовать его, поскольку он дает некоторые надежные гарантии (потому что он становится стандартом).
Обновление: теперь, когда у нас есть стандартные библиотеки потоков, мы сделаем еще кое-что. Некоторые конструкции boost, такие как boost :: shared_mutex, не были стандартизированы (но, возможно, позже). Однако стандартная библиотека лучше использует семантику хода. Полезно знать, прежде чем выбирать библиотеку. Кроме того, для использования библиотеки потоков C ++ 11 требуется компилятор, который ее предоставляет. Сегодня это относится не ко всем компиляторам.
Обновление: Теперь [ноябрь 2012] большинство стандартных компиляторов предоставляют библиотеку потоков C ++ 11. VS2012, GCC4.8 и Clang3.1 поддерживают потоки, примитивы синхронизации и атомарные операции. Для полной реализации вы также можете использовать только поток Энтони Уильямса. Это совместимая с C ++ 11 библиотека, поддерживаемая в Windows / Mac и Linux.
Ссылки на состояние функций C ++ 11 с различными компиляторами:
Также посмотрите 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]);
В C ++ 11 входит библиотека потоковой передачи. Он построен на библиотеке ускоренных потоков. К сожалению, я, кажется, помню, что есть нетривиальные различия между Boost.Threads и тем, что поставляется с C ++ 11. Тем не менее, если вы планируете перейти на стандартную библиотеку потоков C ++, я считаю, что Boost.Threads - это самое близкое, к чему вы можете добраться сейчас.
Я полагаю, что под капотом эти библиотеки будут использовать потоки Pthreads в системах POSIX и любую встроенную поддержку потоковой передачи, доступную где-либо еще.
Отказ от ответственности: я не работал ни с одним из них.
SDL прост, кроссплатформенен и поддерживает многопоточность.
Pthreads
работают только на POSIX-системах. QThread
из Qt
- это выход. Он доступен на платформах: Linux, Mac OS X, Windows, Embedded Linux, Windows CE, Symbian, Maemo.
Qt имеет довольно хорошую поддержку потоков. Если вам просто нужно создать поток и выполнить в нем код, QThread
- это все, что вам нужно. Существует множество других высокоуровневых классов, которые могут помочь вам с пулами потоков или даже абстрагировать параллельное выполнение (фреймворк QtConcurrent).
Pthread является частью Posix, но не все posix системы будут иметь потоки. pthreads является наиболее переносимым.
Какие платформы вы будете поддерживать?
Перечислите соответствующие платформы. Если вы используете, скажем, только Linux/Mac/Windows, то boost::thread, скорее всего, подойдет вам, пока C++0x (harhar) не предоставит std::thread.
wxWidgets имеет классы потоков, и, поскольку wxWidgets не зависит от платформы, это может быть лучшим вариантом для вас.
Boost.Threads построен на основе PThreads в системах UNIX и Win32 Threads в Windows.
Библиотека boost синтаксически проста, и все хлопоты по правильному взаимодействию кода C ++ с библиотеками C решаются за кулисами. Однако, если вам не очень нравится C ++, PThreads может показаться более простым с его простым C API.
Qt Threads также является хорошей библиотекой, но поскольку я использую несколько других библиотек Boost, я компилирую и компоновку с Boost, несмотря ни на что. Я не всегда могу ссылаться на Qt. И, ну, я просто не хочу вспоминать, как использовать две разные библиотеки.
Я использовал потоки pthread для кода, который работает на нескольких платформах. Чтобы обойти недостаток pthread в Windows, я с большим успехом использовал следующую библиотеку с открытым исходным кодом: POSIX Threads для Windows