Frage

Im Moment arbeite ich auf einer Multi-Threaded-Anwendung, die auf dem Arm und ppc Architektur eingesetzt werden würde. Ich habe ein Problem mit pthread_cancel auf dem Arm.

pthread_cancel auf Arm verhält sich nicht gleich mit ppc. Der Faden wird abgebrochen, aber der Destruktor für die lokale Variable Thread wird nicht auf den Arm genannt zu werden. Ich habe auch versucht eine Storno Bereinigung-Handler-Routine über pthread_cleanup_push installiert explizit zu definieren. Aber es wird nicht aufgerufen wird, wenn der Thread abgebrochen wird.

Der Code funktioniert mit ppc in Ordnung. Wenn ein Thread abgebrochen wird, destructor lokale Variable genannt wird. Und wenn ich explizit eine Bereinigung Handler definiert wurde aufgerufen und ausgeführt, wenn pthread_cancel genannt wurde.

Bin ich etwas fehlt? Einige Compiler-Optionen vielleicht?

  • Programmiersprache: C ++
  • Compiler: arm-linux-g ++ / powerpc-linux-g ++
  • OS: Linux

EDIT:

Ich habe eine Art ähnliches Problem auf dieser libc Fehler protokolliert gefunden .

gcc anstelle von g ++ und dem Hinzufügen von -fno-Ausnahme-Compiler-Option des Tricks. Aber ich möchte wirklich Sachen hinter dieser Frage zu verstehen. Darüber hinaus ist die -fno-Ausnahme bedeutet, dass ich nicht in der Lage sein, die Ausnahmebehandlung in meiner Anwendung auszuführen, nicht, dass ich es jetzt bin mit aber ich könnte in der Zukunft sein.

Danke.

War es hilfreich?

Lösung

Thread Stornierung ohne die Hilfe von der Anwendung ist eine schlechte Idee. Nur google . Es ist viel besser, dem Faden sagen zu mir selbst zu beenden, indem einem Flag-Variable Einstellung, die periodisch durch den Thread überprüft wird.

Eigentlich ist Stornierung so hart, dass es aus dem aktuellen C ++ 0x Entwurf weggelassen wurde. Sie können suchen http://www.open -std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html und wird überhaupt keine Erwähnung finden Stornierung. Hier ist die Definition der vorgeschlagenen Thread-Klasse (Sie werden dort nicht finden Abbrechen):

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();
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top