5

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

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

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

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

  • プログラミング言語: C++
  • コンパイラ: arm-linux-g++/powerpc-linux-g++
  • OS: リナックス

編集:

私は、このlibc bugに記録された、一種の同様の問題を発見しました。

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

ありがとう。

4

1 に答える 1

2

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

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

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();
};
于 2009-06-03T19:46:50.370 に答える