pthread_cancel ведет себя по-разному на руку и PPC? - PullRequest
5 голосов
/ 12 марта 2009

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

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

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

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

  • Язык программирования: C ++
  • Компиляторы: arm-linux-g ++ / powerpc-linux-g ++
  • ОС: Linux

EDIT:

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

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

Спасибо.

1 Ответ

2 голосов
/ 03 июня 2009

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

На самом деле отмена настолько сложна, что она была опущена в последней версии C ++ 0x. Вы можете выполнить поиск http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 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();
};
...