質問

現在、armおよびppcアーキテクチャにデプロイされるマルチスレッドアプリケーションに取り組んでいます。腕のpthread_cancelに問題があります。

pthread_cancel on armは、ppcと同じ動作をしません。スレッドはキャンセルされますが、スレッドのローカル変数のデストラクタはアームで呼び出されていません。また、pthread_cleanup_pushを介してインストールされたキャンセルクリーンアップハンドラルーチンを明示的に定義しようとしました。ただし、スレッドがキャンセルされたときに呼び出されることはありません。

コードはppcで正常に動作します。スレッドがキャンセルされると、ローカル変数のデストラクタが呼び出されます。また、クリーンアップハンドラーを明示的に定義すると、pthread_cancelが呼び出されたときに呼び出され、実行されました。

何か不足していますか?おそらくいくつかのコンパイラー・オプションですか?

  • プログラミング言語:C ++
  • コンパイラ:arm-linux-g ++ / powerpc-linux-g ++
  • OS:Linux

編集:

この libcバグで、同様の問題が記録されているのを発見しました。

g ++の代わりにgccを使用し、-fno-exceptionコンパイラオプションを追加するとうまくいきました。しかし、私は本当にこの問題の背後にあるものを理解したいと思います。さらに、-fno-exceptionは、アプリケーションで例外処理を実行できないことを意味します。現在使用しているのではなく、将来的に使用する可能性があります。

ありがとう。

役に立ちましたか?

解決

アプリケーションの助けを借りずにスレッドをキャンセルするのは悪い考えです。 google だけです。スレッドによって定期的にチェックされるフラグ変数を設定することにより、スレッド自体に終了するように指示する方がはるかに優れています。

実際にはキャンセルは非常に難しいため、最新のC ++ 0xドラフトでは省略されています。 http://www.openを検索できます。 -std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html にあり、キャンセルに関する言及はまったくありません。提案されたスレッドクラスの定義は次のとおりです(キャンセルはありません):

class thread
{
public:
    // types:
    class id;
    typedef implementation-defined native_handle_type; // See [thread.native]

    // construct/copy/destroy:
    thread();
    template <class F> explicit thread(F f);
    template <class F, class ...Args> thread(F&& f, Args&&... args);
    ~thread();
    thread(const thread&) = delete;
    thread(thread&&);
    thread& operator=(const thread&) = delete;
    thread& operator=(thread&&);

    // members:
    void swap(thread&&);
    bool joinable() const;
    void join();
    void detach();
    id get_id() const;
    native_handle_type native_handle(); // See [thread.native]

    // static members:
    static unsigned hardware_concurrency();
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top