Вопрос

В настоящее время я работаю над многопоточным приложением, которое будет развернуто на архитектуре Arm и PPC.У меня возникла проблема с pthread_cancel на руке.

pthread_cancel на руке не ведет себя так же, как и ppc.Поток завершается, но деструктор локальной переменной потока не вызывается в Arm.Я также попытался явно определить процедуру обработчика очистки отмены, установленную через pthread_cleanup_push.Но он не вызывается при отмене потока.

Код отлично работает с ppc.Когда поток завершается, вызывается деструктор локальной переменной.И когда я явно определил обработчик очистки, он вызывался и выполнялся при вызове pthread_cancel.

Я что-то пропустил?Возможно, какие-то параметры компилятора?

  • Язык программирования:С++
  • Составители:рука-linux-g++/powerpc-linux-g++
  • ОПЕРАЦИОННЫЕ СИСТЕМЫ:Линукс

РЕДАКТИРОВАТЬ:

Я нашел похожую проблему, зарегистрированную на этом ошибка в libc.

Использование gcc вместо g++ и добавление опции компилятора -fno-Exception помогло.Но я действительно хочу понять, что стоит за этой проблемой.Более того, -fno-Exception означает, что я не смогу выполнять обработку исключений в своем приложении, не то чтобы я использовал его сейчас, но, возможно, буду использовать в будущем.

Спасибо.

Это было полезно?

Решение

Отмена потока без помощи приложения — плохая идея.Только Google.Гораздо лучше сообщить потоку о завершении самого себя, установив переменную-флаг, которая периодически проверяется потоком.

На самом деле отмена настолько сложна, что ее исключили из последней версии C++0x.Вы можете искать http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html и вообще не найду упоминания об отмене.Вот определение предлагаемого класса потока (вы не найдете там отмены):

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();
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top