Pergunta

Atualmente estou trabalhando em um aplicativo multi-threaded que seria implantado no braço e arquitetura ppc. Eu estou tendo algum problema com pthread_cancel no braço.

pthread_cancel no braço não se comportam da mesma com ppc. O fio fica cancelado, mas o destruidor para a variável local do segmento não está sendo chamado no braço. Eu também tentei definir explicitamente uma rotina de tratamento de limpeza cancelamento instalado através pthread_cleanup_push. Mas ele não está sendo chamado quando o fio é cancelada.

O código fina trabalha com ppc. Quando um segmento é cancelada, destruidor da variável local está sendo chamado. E quando eu definido explicitamente um manipulador de limpeza, foi chamado e executado quando pthread_cancel foi chamado.

Estou faltando alguma coisa? Algumas opções do compilador talvez?

  • linguagem de programação: C ++
  • Compiladores: braço-linux-g ++ / powerpc-linux-g ++
  • OS: Linux

EDIT:

Eu encontrei uma espécie de problema semelhante registrado neste bug libc .

Usando gcc em vez de g ++ e adicionando -fno-exceção opção do compilador fez o truque. Mas eu realmente quero entender coisas para trás esta questão. Além disso, os meios -fno-de exceção não vou ser capaz de realizar o tratamento de exceção na minha candidatura, não que eu estou usando agora, mas eu poderia ser no futuro.

Graças.

Foi útil?

Solução

o cancelamento de threads sem a ajuda da aplicação é uma má idéia. Apenas google . É muito melhor para dizer o fio para terminar em si, definindo uma variável de sinalizador que é verificado periodicamente pelo fio.

Na verdade cancelamento é tão forte que foi omitida a última C ++ 0x projecto. Você pode pesquisar http://www.open -std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html e não vai encontrar nenhuma menção de cancelamento em tudo. Aqui está a definição da classe Thread proposto (você não vai encontrar cancelar lá):

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();
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top