pthread_cancel ведет себя по-разному на руке и PPC?
Вопрос
В настоящее время я работаю над многопоточным приложением, которое будет развернуто на архитектуре 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();
};