c++ - 线程取消 (pthread) & C++

标签 c++ linux multithreading pthreads cancellation

我正在用 C++ 为 Linux 编写 MT 程序,我想知道如何执行线程取消。

据我了解,当线程被取消时,会在线程的函数内部调用清理函数,并且线程的函数将被强制退出。这意味着两件事:

  1. 当线程被取消时,它仍然调用在线程函数内创建的所有 C++ 对象的析构函数。
  2. 我可以将指向在线程函数中创建的对象的指针传递给清理函数。

我说得对吗,下面的代码工作得很好吗?


下面代码中还有一个问题,当SECTION A中的某个地方取消线程时,second_thread_cleanup_function()将首先被调用,对吧?

class SomeObject
{
    public:
        ~SimpleObject (void); // <- free dynamically allocated memory

        void finalize (void);

        // ...
}

void first_thread_cleanup_function (void* argument)
{
    SomeObject* object (argument);

    object->finalize ();
}

void second_thread_cleanup_function (void* argument)
{
    // ... do something ...
}

void* thread_function (viod* argument)
{
    SomeObject object;

    pthread_cleanup_push (first_thread_cleanup_function, &object);

    // ... some code ...

    pthread_cleanup_push (second_thread_cleanup_function, NULL);
    // ... SECTION A ...
    pthread_cleanup_pop (0);

    // .. some code ...

    pthread_cleanup_pop (1);
}

最佳答案

只有在您在清理方法中释放分配的对象的情况下才会调用析构函数。否则,不行。

是的,A 部分中的清理调用顺序是正确的。

关于c++ - 线程取消 (pthread) & C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224878/

相关文章:

c++ - 如何在 C++ 源代码、DLL 或 VC++ 编译器创建的任何文件中查找所有全局变量?

c++ - C++ 字符串中 "size"和 "capacity"之间的区别?

linux - 需要 sudo 权限时使用 vim 写入文件

c# - 在类库中获取 UI 调度程序

c++ - 如何在 boost::threadpoool 中安排成员函数执行

c++ - 如何更改 Qt 中的窗口标题和中央小部件?

c++ - setShortcut 的多个键盘快捷键

linux - 在程序集递归中求解帕斯卡三角 (nCk)

linux - 使用 Ansible 在 Kubernetes 集群中实现证书轮换功能

ios - Swift 中带有 Firestore 的完成处理程序的替代方案