1

パターン マッチング アルゴリズム (pthread、omp) にさまざまなマルチスレッド アプローチを適用し、それらをそれぞれの順次実装と比較する小さな大学プロジェクトを行っています。

現時点では問題なく動作しており、アルゴリズムと gcc の最適化によっては、実行時間が約 2 ~ 3 分の 1 に短縮されています。

今は std::thread でもやりたいのですが、調べてみると Linux の Pthreads で実装されているので、何か意味があるのか​​なと思っていました。

4

3 に答える 3

4

場合によります。両方の API で同じことができますが、次の点が異なります。

  • pthreads は POSIX の一部であるため、ほぼすべての *nix OS で使用できますが、Windows では (ネイティブに) 使用できません。
  • pthreads は C API です。C コードから簡単に呼び出すことができますが、C++ の機能を利用して 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方法です。

于 2013-10-06T13:50:31.107 に答える
4

std::threadは ISO C++ 標準言語によって提供される機能であるため、C++11 に準拠するプラットフォームおよび実装で使用できます。pthread一方、s は IEEE 標準に準拠しているため、C++ 標準の一部ではありません。

したがって、アプリケーションまたはマルチスレッド コードをさまざまなプラットフォームで実行する必要がstd::threadある場合は、まったく変更を加えることなく、すべてのプラットフォームでそのまま機能するように使用するのが理にかなっています。クロスプラットフォームの互換性を心配していない場合は、pthreads で問題ありません。

于 2013-10-06T13:20:53.837 に答える
2

移植性に関する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();
}
于 2013-10-06T13:41:00.350 に答える