7

pthread の以前のスレッド ラッパーを std::thread に変換しています。ただし、c++11 にはスレッドをキャンセルする方法がありません。ただし、スレッドは外部ライブラリ内で非常に長いタスクを実行している可能性があるため、スレッドをキャンセルする必要があります。

プラットフォームで pthread_id を提供する native_handle の使用を検討していました。Linux (Ubuntu 12.10) で gcc 4.7 を使用しています。アイデアは次のようになります。

#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

int main(int argc, char **argv) {
    cout << "Hello, world!" << endl;

    auto lambda = []() {
        cout << "ID: "<<pthread_self() <<endl;
        while (true) {
            cout << "Hello" << endl;
            this_thread::sleep_for(chrono::seconds(2));
        }
    };

    pthread_t id;
    {
        std::thread th(lambda);

        this_thread::sleep_for(chrono::seconds(1));

        id = th.native_handle();
        cout << id << endl;
        th.detach();
    }
    cout << "cancelling ID: "<< id << endl;

    pthread_cancel(id);

    cout << "cancelled: "<< id << endl;

    return 0;
}

スレッドは、pthreads によってスローされた例外によってキャンセルされます。

私の質問は:

このアプローチに問題はありますか (移植性がないこと以外に)?

4

1 に答える 1

4

いいえ、次の問題以外に問題が発生することはないと思います。

  • ポータブルではない
  • キャンセルされたスレッドのすべてのオブジェクトが破棄されるように_very_very_を注意深くプログラムする必要があります。

たとえば、標準では、スレッドが終了すると変数は破棄されるとされています。スレッドをキャンセルすると、不可能ではないにしても、コンパイラにとってこれははるかに困難になります。

したがって、どういうわけか回避できる場合は、スレッドをキャンセルしないことをお勧めします。標準のポーリングループを作成し、条件変数を使用し、シグナルをリッスンして読み取りを中断するなど、スレッドを定期的に終了します。

于 2012-11-26T11:34:22.427 に答える