パターン マッチング アルゴリズム (pthread、omp) にさまざまなマルチスレッド アプローチを適用し、それらをそれぞれの順次実装と比較する小さな大学プロジェクトを行っています。
現時点では問題なく動作しており、アルゴリズムと gcc の最適化によっては、実行時間が約 2 ~ 3 分の 1 に短縮されています。
今は std::thread でもやりたいのですが、調べてみると Linux の Pthreads で実装されているので、何か意味があるのかなと思っていました。
パターン マッチング アルゴリズム (pthread、omp) にさまざまなマルチスレッド アプローチを適用し、それらをそれぞれの順次実装と比較する小さな大学プロジェクトを行っています。
現時点では問題なく動作しており、アルゴリズムと gcc の最適化によっては、実行時間が約 2 ~ 3 分の 1 に短縮されています。
今は std::thread でもやりたいのですが、調べてみると Linux の Pthreads で実装されているので、何か意味があるのかなと思っていました。
場合によります。両方の API で同じことができますが、次の点が異なります。
std::thread
標準の C++ API です。これは、言語外の個別の仕様の一部ではありません (pthreads が C や C++ ではなく POSIX の一部であるように)。そのため、最新の C++ コンパイラ (*nix と Windows の両方を含む) を備えたすべてのプラットフォームで利用できます。std::thread
は C++ API であるため、C から呼び出すことはできません --- 一方で、より簡単で安全に使用できます。RAII を多用してリソースがスコープ外になったときにクリーンアップされるようにし、関数オブジェクトからスレッドを作成できるようにし、C スタイルのフリー関数に制約されるのではなく、あらゆる柔軟性を提供します。 .だからそれは依存します。コードを C だけでなく C++ からも使用したい場合は、pthreads を使用することをお勧めします。一方、C++ のみで、OS に関係なく動作させたい場合は、こちらstd::thread
が望ましいです。素敵なC++ コードを書きたいだけなら、それも良いstd::thread
方法です。
std::thread
は ISO C++ 標準言語によって提供される機能であるため、C++11 に準拠するプラットフォームおよび実装で使用できます。pthread
一方、s は IEEE 標準に準拠しているため、C++ 標準の一部ではありません。
したがって、アプリケーションまたはマルチスレッド コードをさまざまなプラットフォームで実行する必要がstd::thread
ある場合は、まったく変更を加えることなく、すべてのプラットフォームでそのまま機能するように使用するのが理にかなっています。クロスプラットフォームの互換性を心配していない場合は、pthread
s で問題ありません。
移植性に関するAlok Saveの回答(それ自体が大きな利点です)に加えて...
pthreads
は C API であるため、特に例外の安全性に関する限り (独自のラッパーを作成した場合を除き、デバッグと維持)。
std::thread
などは、十分にテストされた例外セーフな最新の C++ ラッパーと、より簡単かつ安全に使用できるようにする多くの便利な機能 (ラムダ、、、... のサポートなど) をstd::function
提供しています。std::bind
たとえば、次のコードは、次のように記述してデバッグするのがはるかに困難になりますpthreads
。
std::mutex m;
struct ThreadClass {
ThreadClass(int p1, int p2, int p3)
: t(std::bind(&ThreadClass::run, this, p1, p2, p3))
// notice how I'm binding to a member function, not a static one
// additionally I'm also binding additional parameters, which
// avoids using member variables
{}
void run(int p1, int p2, int p3) {
{
auto l = std::lock_guard<std::mutex>(m);
// do something while locked
// the lock will be automatically released when you
// exit the scope, no matter how (including return and throw)
}
// continue unlocked
}
std::thread t;
}
void fireAndForget(int param) {
std::thread t([=]() {
// do something with param (captured by the lambda)
});
t.detach();
}