Является ли PThread хорошим выбором для многопоточной программы C/С++ многопоточности?

В течение последних пяти лет выполнял в основном Java и smattering.NET. На этом этапе не было написано никаких значительных C или С++. Так что на какое-то время было далеко от этой сцены.

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

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

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

ADDENDUM EDIT:

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

Ответы

Ответ 1

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

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

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

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

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

edit: кросс-платформенные возможности выше:

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

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

Ответ 2

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

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

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

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

например.

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

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

Ответ 3

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

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

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

Ответ 4

Я сделаю ставку на ZThread

Простой API, более простой в использовании, чем PThreads и FREE

Ответ 5

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

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