Question

Je travaille actuellement sur une application multithread qui serait déployée sur les architectures arm et ppc. J'ai un problème avec pthread_cancel au bras.

pthread_cancel au bras ne se comporte pas de la même façon avec ppc. Le thread est annulé mais le destructeur de la variable locale du thread n'est pas appelé sur arm. J'ai également essayé de définir de manière explicite une routine de gestionnaire de nettoyage d'annulation installée via pthread_cleanup_push. Mais il n'est pas appelé lorsque le fil est annulé.

Le code fonctionne bien avec ppc. Lorsqu'un thread est annulé, le destructeur de la variable locale est appelé. Et quand j’ai explicitement défini un gestionnaire de nettoyage, il était appelé et exécuté lors de l’appel de pthread_cancel.

Est-ce que je manque quelque chose? Quelques options de compilateur peut-être?

  • Langage de programmation: C ++
  • Compilateurs: arm-linux-g ++ / powerpc-linux-g ++
  • Système d'exploitation: Linux

EDIT:

J'ai trouvé une sorte de problème similaire consigné sur ce bug libc .

L'utilisation de gcc au lieu de g ++ et l'ajout de l'option de compilation -fno-exception ont fait l'affaire. Mais je veux vraiment comprendre ce qui se cache derrière ce problème. De plus, avec l'option -fno-exception, je ne pourrai pas gérer la gestion des exceptions dans mon application. Ce n'est pas que je l'utilise maintenant, mais je le serai peut-être plus tard.

Merci.

Était-ce utile?

La solution

L'annulation de fil sans l'aide de l'application est une mauvaise idée. google . Il est bien mieux de dire au thread de se terminer en définissant une variable indicateur vérifiée périodiquement par le thread.

En réalité, l'annulation est tellement difficile qu'elle a été omise du dernier brouillon C ++ 0x. Vous pouvez effectuer une recherche dans http://www.open -std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html et ne trouve aucune mention d'annulation. Voici la définition de la classe de thread proposée (vous ne trouverez pas cancel ici):

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();
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top