15

過去5年間、主にJavaと.NETの断片化を行っており、その間、重要なCまたはC++を記述していません。だからしばらくの間そのシーンから離れていた。

マルチスレッドを実行し、Windows、Mac OS X、およびLinux / Unix間でソースコードを移植できるCまたはC++プログラムを今日作成したい場合、PThreadは良い選択ですか?

CまたはC++コードはGUIを実行しないため、そのいずれについても心配する必要はありません。

ただし、Windowsプラットフォームの場合、UNIXエミュレーションランタイムライブラリの観点から、多くのUnixの手荷物を持ち込みたくありません。既存のWindowsスレッドAPIよりも可能な限り薄いラッパーであるWindows用のPThreadAPIを優先します。

補遺編集:

boost:threadを使用する傾向があります-C++のtry/catch例外処理も使用できるようにしたいと考えています。そして、私のプログラムはかなり最小限で、特にOOPishではありませんが、Cの非実体化された関数ではなく、クラスと名前空間を使用してカプセル化するのが好きです。

4

5 に答える 5

15

pthreads は、スレッド化されたプログラムを作成するための古い posix 標準です。これは最も低いレベルのスレッド化ルーチンであるため、クロスプラットフォームのスレッド化に適しています。

ただし、代替手段があります。

後者はすべてのプラットフォームで完全にサポートされているため ( Pthreads-w32を使用する場合を除き、pthreads は Windows posix サブシステムの唯一の部分として少しのコンパイラ設定を必要とします)、おそらく後者の方が良い選択です。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をサポートしています。

于 2009-01-31T23:30:32.667 に答える
11

コードを真に移植可能にする必要がある場合は、インターネットに分散しているさまざまなライブラリから離れた方がよい場合があります。ある時点で、サポートされていないプラットフォームが見つかり、独自のブランチを作成する必要があります。

これも解決が難しい問題ではなく、クロスプラットフォーム コードを作成するための良い練習になる可能性があります。

プラットフォームごとに個別の .cpp 実装を持つ CThread などのクラスと、スレッドの構築/実行後に呼び出される純粋仮想 execute() 関数を作成することをお勧めします。

これにより、プラットフォームに最も適した API を使用して、すべてのスレッド作成およびスリープ/シャットダウン/優先コードを実装できます。各プラットフォームの定義/タイプ定義を含むヘッダー (例: ThreadTypes.h) も必要になる場合があります。

例えば

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

これは、PC/PS2/PS3/360/Wii などのプラットフォーム用のすべてのクロスプラットフォーム スレッド コードを書いた方法です。また、ミューテックスやセマフォのようなものに従うのも良いパターンです。スレッドがある場合、ある時点で確実に必要になります:)

于 2009-02-01T00:19:41.493 に答える
4

いいえ、pthreads は Windows では通常利用できません。(実装の試みはいくつかありますが、少なくとも OS では直接サポートされていません。)

C++ を作成している場合は、いつものように Boost が答えです。Boost.Thread には、移植可能な (そしてより安全な) スレッド ライブラリがあります。

C では、おそらく最も簡単な解決策は、pthreads と Windows スレッド API の両方に共通のラッパーを作成することです。

于 2009-01-31T23:23:51.073 に答える
0

ting もご覧ください: http://code.google.com/p/ting/

これは、Windows と Linux の間のクロス プラットフォームです。Mac OS のサポートはまだありません。

于 2010-03-17T13:39:51.833 に答える
0

ZThreadに賭けます

シンプルな API、PThreads および FREE よりも使いやすい

于 2009-08-22T03:48:29.960 に答える