2009-01-31 6 views
13

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

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

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

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

ADDENDUM EDIT:

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

ответ

14

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

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

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

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

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

редактировать: кросс-платформенный способности выше:

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

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

+0

«Как все полностью поддерживаются на всех платформах». Если все платформы вы имеете в виду Windows и пару платформ nix, это верно. Кроме этого это не так. –

+0

см. Мое редактирование. ОП никогда не просил ничего, кроме трех платформ. – gbjbaanb

+0

Я принял этот ответ, потому что он представил самый широкий диапазон информации о возможных способах продолжения. – RogerV

4

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

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

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

11

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

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

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

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

E.g.

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

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

+0

Мне это нравится - анонимные downvotes от людей, которые, вероятно, никогда не отправляли приложение на нескольких платформах! FTW! –

+0

Эй, Эндрю, я отправил оригинальный вопрос. Был немного удивлен, увидев, что вы тоже проголосовали.Я пропустил тонкие классы C++ по потоку Win32 - мне просто нужно было бы абстрагироваться над POSIX Pthreads тоже, и я бы это сделал. С другой стороны, есть Pthreads-win32. Все остальное уже имеет Pthreads. – RogerV

+0

+1: Инкапсуляция - это всегда * ваш друг. Это может показаться дополнительной работой, но что минимальное дополнительное время в конечном итоге спасет вашу задницу. Особенно, когда кто-то нарушает стандарт и имеет неожиданные значения ошибок для тестирования. –

0

Я поставлю на ZThread

Simple API, проще в использовании чем PThreads и бесплатно

+0

Любая идея, почему я получаю так много сообщений на консоли при использовании библиотеки Zthread? Такие, как 'ThreadQueue created',' User thread created 'и т. Д. Кажется, это сообщения DEBUG из библиотеки, как я могу отключить их? – lqr