C++で記述された使いやすいクロスプラットフォームのスレッドライブラリを探しています。
boost::thread
またはPthreads
についてどう思いますか? PthreadはPOSIX準拠のシステムでのみ実行されますか?
Qt
ライブラリのスレッドサポートはどうですか?
Boost.Threadは、C++言語の今後の標準スレッドライブラリのドラフトです。それを知って、私はそれがいくつかの強力な保証を提供するのでそれを使うことを好みます(それが標準になるので)。
更新:標準のスレッドライブラリができたので、もう少し精度が上がります。 boost :: shared_mutexなどの一部のboost構造は、標準化されていません(ただし、後で使用される可能性があります)。ただし、標準ライブラリは移動セマンティクスをより適切に活用します。ライブラリを選択する前に知っておくとよいでしょう。また、C++ 11スレッドライブラリを使用するには、それを提供するコンパイラが必要です。今日のすべてのコンパイラに当てはまるわけではありません。
更新:[2012年11月]ほとんどの標準コンパイラはC++ 11スレッドライブラリを提供します。 VS2012、GCC4.8、およびClang3.1は、スレッドと同期プリミティブおよびアトミック操作をサポートしています。完全に実装するには、AnthonyWilliamsによるスレッドだけを使用することもできます。これは、Windows/MacおよびLinuxでサポートされているC++ 11準拠のライブラリです。
さまざまなコンパイラでのC++ 11機能のステータスへのリンク:
C++ 11に付属しているスレッドライブラリがあります。これは、ブーストスレッドライブラリに基づいて構築されています。残念ながら、Boost.ThreadsとC++ 11に付属しているものとの間には重要な違いがあることを覚えているようです。それでも、C++標準のスレッドライブラリに切り替える予定がある場合は、Boost.Threadsが現在のところ最も近いと思います。
内部的には、これらのライブラリはPOSIXシステムでPthreadを使用し、他の場所で利用可能なネイティブスレッドサポートはすべて使用すると思います。
免責事項:私は2つのどちらとも仕事をしていません。
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]);
Pthreads
はPOSIXシステムでのみ実行されています。 QThread
からのQt
は行く方法です。プラットフォームで利用可能です:Linux、Mac OS X、Windows、Embedded Linux、Windows CE、Symbian、Maemo。
Intel TBBライブラリ (私の別の回答にリンクされている)について誰も言及していないことに驚いています。また、 タスクベースの実装を優先する必要があります スレッドベースよりも。
関係するプラットフォームをリストします。たとえば、Linux/Mac/Windowsのみを使用している場合は、C++ 0x(harhar)がstd :: threadを提供するまで、boost :: threadで問題ない可能性があります。
複数のプラットフォームで動作するコードにpthreadを使用しました。 Windowsのpthreadの不足を回避するために、次のオープンソースライブラリを使用して大成功を収めました。 POSIX Threads for Windows
Qtはかなり良いスレッドサポートを持っています。スレッドを作成してその中でコードを実行する必要がある場合は、QThread
だけで十分です。スレッドプールを支援したり、並行実行(QtConcurrentフレームワーク)を抽象化したりするのに役立つ他の多くの高レベルクラスがあります。
wxWidgets にはスレッドクラスがあり、wxWidgetsはプラットフォームに依存しないため、uにとって最適な場合があります。
Boost.Threadsは、UNIXシステムのPThreadsとWindowsのWin32Threadsの上に構築されています。
Boostライブラリは構文的に単純であり、C++コードをCライブラリと適切にインターフェイスするという厄介なビジネスはすべて舞台裏で行われます。ただし、C++にあまり慣れていない場合は、PThreadsは単純なCAPIを使用する方が簡単に思えるかもしれません。
Qt Threadsも優れたライブラリですが、他のいくつかのBoostライブラリを使用しているため、何があってもコンパイルしてBoostに対してリンクします。私はいつもQtに対してリンクするとは限らないかもしれません。そして、まあ、私は2つの異なるライブラリの使用方法を覚えたくありません。
SDLはシンプルでクロスプラットフォームであり、スレッド化をサポートしています。
PthreadはPosixの一部ですが、すべてのposixシステムにスレッドがあるわけではありません。 pthreadsは最も移植性があります。
どのプラットフォームをサポートしますか?