Есть ли в C ++ библиотека кроссплатформенных потоков? - PullRequest
24 голосов
/ 01 апреля 2010

Я ищу простую в использовании библиотеку кроссплатформенных потоков, написанную на C ++.

Что вы думаете о boost::thread или Pthreads? Работают ли Pthreads только в POSIX-совместимых системах?

А как насчет поддержки потоков в библиотеке Qt?

Ответы [ 12 ]

33 голосов
/ 01 апреля 2010

Boost.Thread - черновик для будущей стандартной библиотеки потоков языка C ++. Зная это, я предпочитаю использовать его, так как он дает некоторые сильные гарантии (потому что он становится стандартным).

Обновление: теперь, когда у нас есть стандартные библиотеки потоков, еще немного точности. Некоторые буст-конструкции, такие как boost :: shared_mutex, не были стандартизированы (но могут появиться позже). Однако стандартная библиотека лучше использует семантический ход. Полезно знать, прежде чем выбрать библиотеку. Кроме того, для использования библиотеки потоков C ++ 11 требуется компилятор, который ее предоставляет. Это не относится ко всем компиляторам сегодня.

Обновление: Теперь [Nov2012] большинство стандартных компиляторов предоставляют библиотеку потоков C ++ 11. VS2012, GCC4.8 и Clang3.1 поддерживают потоки, примитивы синхронизации и атомарные операции. Для полной реализации вы также можете использовать только поток Энтони Уильямса. Это библиотека, совместимая с C ++ 11, поддерживаемая в Windows / Mac и Linux.

Ссылки на статус функций C ++ 11 с различными компиляторами:

8 голосов
/ 01 апреля 2010

В C ++ 11 есть библиотека потоков. Он построен на расширенной библиотеке потоков. К сожалению, я помню, что между Boost.Threads и тем, что поставляется в C ++ 11, есть нетривиальные различия. Тем не менее, если вы планируете переключиться на стандартную библиотеку потоков C ++, я считаю, что Boost.Threads - самый близкий к вам доступ.

Я полагаю, что эти скрытые библиотеки будут использовать Pthreads в системах POSIX и любую поддержку встроенных потоков, доступную в других местах.

Отказ от ответственности: я не работал ни с одним из двух.

4 голосов
/ 01 апреля 2010

Также взгляните на OpenMP , это набор (несколько стандартных) pragma s спецификаций, который поддерживается большинством основных компиляторов . Преимущество 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]);

Очевидно, что возможно также сделать больше комплекс вещи .

4 голосов
/ 01 апреля 2010

Pthreads работают только в системах POSIX. QThread из Qt - это путь. Он доступен на платформах: Linux, Mac OS X, Windows, Embedded Linux, Windows CE, Symbian, Maemo.

3 голосов
/ 11 сентября 2011

Я удивлен, что никто не упомянул библиотеку Intel TBB (связана с другим моим ответом). Кроме того, реализация, основанная на задачах, должна быть предпочтительнее , чем основанная на потоках.

2 голосов
/ 06 апреля 2010

Я использовал pthreads для кода, который работает на нескольких платформах.Чтобы обойти отсутствие Windows pthreads, я с большим успехом использовал следующую библиотеку с открытым исходным кодом: POSIX Threads для Windows

2 голосов
/ 01 апреля 2010

Список соответствующих платформ. Если вы используете, скажем, Linux / Mac / Windows, тогда boost :: thread, вероятно, будет работать нормально, пока C ++ 0x (harhar) не предоставит std :: thread.

2 голосов
/ 01 апреля 2010

Qt имеет довольно хорошую поддержку потоков. Если вам просто нужно создать поток и запустить в нем некоторый код, QThread - это все, что вам нужно. Существует много других высокоуровневых классов, которые могут помочь вам с пулами потоков или даже абстрагировать параллельное выполнение (инфраструктура QtConcurrent).

1 голос
/ 01 апреля 2010

Boost.Threads построен поверх PThreads в системах UNIX и потоков Win32 в Windows.

Библиотека boost синтаксически проста, и весь сложный бизнес по правильному взаимодействию кода C ++ с библиотеками C решается за кулисами. Однако, если вам не очень комфортно с C ++, PThreads может показаться более простым с его простым C API.

Qt Threads также является хорошей библиотекой, но поскольку я использую несколько других библиотек boost, я буду компилировать и ссылаться на Boost, несмотря ни на что. Я не всегда могу ссылаться на Qt. И, ну, я просто не хочу вспоминать, как использовать две разные библиотеки.

1 голос
/ 01 апреля 2010

wxWidgets имеет классы потоков, и поскольку wxWidgets не зависит от платформы, это может быть просто лучшим решением для вас.

...