首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程取消(p线程)& C++

线程取消(p线程)& C++
EN

Stack Overflow用户
提问于 2010-11-19 12:19:25
回答 3查看 2.6K关注 0票数 2

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

据我所知,当线程被取消时,清除函数在线程的函数中调用,线程的函数被迫退出。这意味着两件事:

  1. 当线程被取消时,它仍然调用线程函数中创建的所有C++对象的析构函数。
  2. i可以传递到清除函数、指向线程函数中创建的对象的指针。

我说得对吗?我的代码写得很好吗?

下面的代码中还有一个问题,当线程在A节中某个位置被取消时,将首先调用,对吗?

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-31 10:36:52

对于使用NPTL的任何现代linux发行版(这实际上意味着运行2.6内核),NPTL将调用析构函数并使用伪异常展开堆栈。

事实上,NPTL坚持它,通过实现它所谓的强制堆栈解除。可以用catch (.)捕获伪异常,但如果这样做,则必须随后重新抛出它,否则整个进程将被终止。

克里斯

票数 1
EN

Stack Overflow用户

发布于 2010-11-19 12:25:05

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

是的,你在A区有清理电话的顺序。

票数 2
EN

Stack Overflow用户

发布于 2017-05-01 22:19:18

关于取消线程的堆栈没有打开的断言--导致本地对象不被破坏--与@Chris关于线程堆栈已解除的断言不一致,并且与以下反例不一致:

代码语言:javascript
复制
#include <climits>
#include <iostream>
#include <pthread.h>
#include <thread>
#include <unistd.h>

class Obj {
public:
    Obj()  { std::clog << "Obj() called\n"; }
    ~Obj() { std::clog << "~Obj() called\n"; }
};

static void cleanup(void* arg) {
    std::clog << "cleanup() called\n";
}

static void run() {
    Obj obj{}; // Local object
    pthread_cleanup_push(cleanup, nullptr);
    ::pause(); // Thread cancelled here
    pthread_cleanup_pop(1);
}

int main(int argc, char **argv) {
    std::thread thread([]{run();});
    ::sleep(1);
    ::pthread_cancel(thread.native_handle());
    thread.join();
}

在执行时,上面的程序指示当线程被取消时,确实会调用本地对象的析构函数:

代码语言:javascript
复制
$ ./a.out 
Obj() called
cleanup() called
~Obj() called
$ 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4224878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档