Pregunta

Actualmente estoy trabajando en una aplicación multiproceso que se implementaría en la arquitectura de brazo y ppc. Tengo algún problema con pthread_cancel en el brazo.

pthread_cancel en el brazo no se comporta igual con ppc. El hilo se cancela pero el destructor de la variable local del hilo no se llama en el brazo. También intenté definir explícitamente una rutina de controlador de limpieza de cancelación instalada a través de pthread_cleanup_push. Pero no se llama cuando se cancela el hilo.

El código funciona bien con ppc. Cuando se cancela un subproceso, se llama al destructor de la variable local. Y cuando definí explícitamente un controlador de limpieza, se llamó y ejecutó cuando se llamó a pthread_cancel.

¿Me estoy perdiendo algo? ¿Algunas opciones de compilación quizás?

  • Lenguaje de programación: C ++
  • Compiladores: arm-linux-g ++ / powerpc-linux-g ++
  • SO: Linux

EDITAR:

He encontrado una especie de problema similar registrado en este error de libc .

Usar gcc en lugar de g ++ y agregar la opción del compilador -fno-exception hizo el truco. Pero realmente quiero entender las cosas detrás de este problema. Además, la excepción -fno significa que no podré realizar el manejo de excepciones en mi aplicación, no es que lo esté usando ahora, sino que podría hacerlo en el futuro.

Gracias.

¿Fue útil?

Solución

La cancelación de hilos sin la ayuda de la aplicación es una mala idea. Simplemente google . Es mucho mejor decirle al subproceso que finalice configurando una variable de marca que el subproceso verifica periódicamente.

En realidad, la cancelación es tan difícil que se ha omitido del último borrador de C ++ 0x. Puede buscar http://www.open -std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html y no encontrará ninguna mención de cancelación. Aquí está la definición de la clase de hilo propuesta (no encontrará cancelar allí):

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top