我正在用C++为Linux编写MT程序,我想知道线程取消是如何执行的。
据我所知,当线程被取消时,清除函数在线程的函数中调用,线程的函数被迫退出。这意味着两件事:
。
我说得对吗?我的代码写得很好吗?
下面的代码中还有一个问题,当线程在A节中某个位置被取消时,将首先调用,对吗?
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);
}发布于 2011-01-31 10:36:52
对于使用NPTL的任何现代linux发行版(这实际上意味着运行2.6内核),NPTL将调用析构函数并使用伪异常展开堆栈。
事实上,NPTL坚持它,通过实现它所谓的强制堆栈解除。可以用catch (.)捕获伪异常,但如果这样做,则必须随后重新抛出它,否则整个进程将被终止。
克里斯
发布于 2010-11-19 12:25:05
只有在清理方法中释放分配的对象的情况下,才会调用析构函数。否则就不会了。
是的,你在A区有清理电话的顺序。
发布于 2017-05-01 22:19:18
关于取消线程的堆栈没有打开的断言--导致本地对象不被破坏--与@Chris关于线程堆栈已解除的断言不一致,并且与以下反例不一致:
#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();
}在执行时,上面的程序指示当线程被取消时,确实会调用本地对象的析构函数:
$ ./a.out
Obj() called
cleanup() called
~Obj() called
$ https://stackoverflow.com/questions/4224878
复制相似问题