Embedded pthread_cancel在arm和ppc上的行为不同?

Embedded pthread_cancel在arm和ppc上的行为不同?,embedded,pthreads,arm,Embedded,Pthreads,Arm,我目前正在开发一个多线程应用程序,它将部署在arm和ppc体系结构上。我对arm上的pthread_cancel有一些问题 arm上的pthread_cancel与ppc的行为不同。线程被取消,但没有在arm上调用线程局部变量的析构函数。我还尝试显式定义通过pthread_cleanup_push安装的取消清理处理程序例程。但是当线程被取消时,它不会被调用 该代码在ppc中运行良好。当线程被取消时,将调用局部变量的析构函数。当我显式定义清理处理程序时,它在调用pthread_cancel时被调用

我目前正在开发一个多线程应用程序,它将部署在arm和ppc体系结构上。我对arm上的pthread_cancel有一些问题

arm上的pthread_cancel与ppc的行为不同。线程被取消,但没有在arm上调用线程局部变量的析构函数。我还尝试显式定义通过pthread_cleanup_push安装的取消清理处理程序例程。但是当线程被取消时,它不会被调用

该代码在ppc中运行良好。当线程被取消时,将调用局部变量的析构函数。当我显式定义清理处理程序时,它在调用pthread_cancel时被调用并执行

我错过什么了吗?也许有一些编译器选项

  • 编程语言:C++
  • 编译器:arm-linux-g++/powerpc-linux-g++
  • 操作系统:Linux
编辑:

我在这个网站上发现了类似的问题

使用gcc而不是g++并添加-fno异常编译器选项就成功了。但我真的很想了解这个问题背后的原因。此外,-fno异常意味着我将无法在我的应用程序中执行异常处理,这不是因为我现在正在使用它,而是我将来可能会使用它


谢谢。

在没有应用程序帮助的情况下取消线程是个坏主意。只是最好通过设置一个由线程定期检查的标志变量来告诉线程结束它自己

实际上,取消是如此困难,以至于在最新的C++0x草案中被省略了。您可以搜索,但根本找不到任何关于取消的内容。下面是建议的线程类的定义(您在这里找不到cancel):

类线程
{
公众:
//类型:
类id;
typedef实现定义的本机\u句柄\u type;//请参阅[thread.native]
//构造/复制/销毁:
螺纹();
模板显式线程(F);
模板线程(F&&F,参数&&…参数);
~thread();
线程(const thread&)=删除;
螺纹(螺纹&&);
线程和运算符=(常量线程&)=删除;
线程和运算符=(线程和运算符);
//成员:
无效交换(线程&&);
bool joinable()常量;
void join();
void detach();
id get_id()常量;
native_handle_type native_handle();//请参阅[thread.native]
//静态成员:
静态无符号硬件_并发();
};

请指定使用的语言和编译器(适用于两种平台)。这听起来像C++,但最好是显式的。这也有助于知道哪些操作系统是pOS包通常是OS特定的。我还建议列出Linux内核的精确版本,目标是在每种情况下使用的平台支持,以及GCC/G++、LIBC和其他任何软件的版本。如果没有精确的版本号,很难提出好的建议。我决定做这样的事情。我只是决定远离pthread_cancel和它可能带来的所有混乱。我只是添加了一个标志变量,表示线程的状态,并检查了一些指定为取消点的区域的状态。我还发送了一个SIGINT来阻止I/O调用。这样我就可以完全控制取消点,线程就可以一直干净优雅地终止。谢谢
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();
};