Является ли PThread хорошим выбором для многоплатформенной многопоточной программы C / C ++? - PullRequest
14 голосов
/ 01 февраля 2009

За последние пять лет я занимался в основном Java и небольшим количеством .NET, и за это время не написал ни одного значимого C или C ++. Так что некоторое время был в стороне от этой сцены.

Если я хочу сегодня написать программу на C или C ++, которая выполняет многопоточность и является переносимым исходным кодом для Windows, Mac OS X и Linux / Unix, - является ли PThread хорошим выбором?

Код на C или C ++ не будет работать с любым графическим интерфейсом, поэтому не нужно беспокоиться об этом.

Для платформы Windows я не хочу приносить много багажа Unix, однако, с точки зрения библиотек времени выполнения эмуляции Unix. Предпочел бы API PThread для Windows, который является более тонкой оболочкой, чем существующие API потоков Windows.

РЕДАКТИРОВАТЬ ДОБАВЛЕНИЕ:

Я склоняюсь к тому, чтобы идти с boost: thread - я тоже хочу уметь использовать C ++ try / catch исключение управляемость тоже. И хотя мой Программа будет довольно минимальной и не особенно ООПиш, мне нравится инкапсулировать, используя класс и пространство имен - в отличие от бессвязных функций C.

Ответы [ 5 ]

15 голосов
/ 01 февраля 2009

Ну, pthreads - это старый стандарт posix для написания многопоточных программ. Это низкоуровневая подпрограмма потоков, поэтому она является хорошим выбором для межплатформенных потоков.

Однако, есть альтернативы:

  • boost :: thread - стиль STL библиотека потоков
  • Intel's Тема Строительные блоки
  • OpenMP - оба это способ более высокого уровня написание потоковых приложений без необходимости делать какие-либо потоки вызовов.

Поскольку последние полностью поддерживаются на всех платформах, (pthreads требует немного настроек компилятора в качестве единственной части подсистемы Windows posix, если вы не хотите использовать Pthreads-w32 ), тогда, возможно, последние являются лучшим выбором. boost :: threads больше похож на библиотеку потоков, другие 2 - это высокоуровневые способы достижения параллелизма без необходимости кодирования «потоков», они позволяют вам писать циклы, которые выполняются одновременно автоматически (при условии соблюдения здравого смысла)

Boost :: thread не является C-совместимой библиотекой.

edit : кроссплатформенные способности вышеперечисленного:

Intel TBB является кроссплатформенным (Windows *, Linux * и Mac OS * X), ​​поддерживает 32-битные и 64-битные приложения и работает с Intel, Microsoft и GNU Составители.

OpenMP зависит от компилятора, который вы хотите использовать, но компиляторы GCC и / или Intel поддерживают OpenMP для Windows, Linux и MacOS.

11 голосов
/ 01 февраля 2009

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

Это также не сложная проблема, и может быть хорошим упражнением для создания кроссплатформенного кода.

Я бы предложил вам создать класс, например, CThread, который имеет отдельные реализации .cpp для каждой платформы и чисто виртуальную функцию execute (), которая вызывается после создания / запуска потока.

Это позволяет реализовать весь код создания потоков и код сна / выключения / приоритета с использованием наиболее подходящего API для платформы. Вам также может понадобиться заголовок (например, ThreadTypes.h), который содержит определения / typedefs для каждой платформы.

1009 * Е.Г. *

// ThreadTypes.h
#if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX)
  typedef DWORD ThreadID
#elif defined(PLATFORM_PS3)
  // etc etc
#endif

Вот как я написал весь свой кросс-платформенный код потоков для таких платформ, как PC / PS2 / PS3 / 360 / Wii. Это также хороший пример для таких вещей, как мьютекс и семафоры, которые, если у вас есть потоки, которые вам обязательно понадобятся в какой-то момент:)

4 голосов
/ 01 февраля 2009

Нет, pthreads обычно не доступны в Windows. (Есть несколько попыток реализовать его, но, по крайней мере, он не поддерживается операционной системой напрямую.)

Если вы пишете на C ++, Boost - это, как обычно, ответ. Boost.Thread имеет переносимую (и более безопасную) библиотеку потоков.

В C простейшее решение, вероятно, состоит в том, чтобы написать общую оболочку для pthreads и Windows Threading API.

0 голосов
/ 17 марта 2010

Посмотрите также на тин: http://code.google.com/p/ting/

Это кроссплатформенный между Windows и Linux. Mac OS пока не поддерживается.

0 голосов
/ 22 августа 2009

Ставлю на ZThread

Простой API, проще в использовании, чем PThreads и БЕСПЛАТНО

...