我正在编写一个多线程C ++程序。我计划杀死线程。但是,我也在使用重新计算的GC。我想知道当一个线程被杀死时堆栈分配的对象是否会被破坏。
答案 0 :(得分:15)
当你“杀死”一个帖子时,堆栈不会展开。
杀死线程不是一种强大的操作方式 - 它们打开的资源(如文件)在进程关闭之前保持打开状态。此外,如果他们在您关闭它们时保持打开任何锁定,锁定可能会保持锁定状态。请记住,您可能会调用许多您无法控制的平台代码,而且您无法始终看到这些内容。
关闭线程的优雅健壮的方法是中断它 - 通常它会轮询以查看它是否被告知定期关闭,或者它正在运行消息循环并且你发送一个退出消息。
答案 1 :(得分:1)
我怀疑它--pthread是一个纯粹的C api,所以我怀疑它是否有任何机制来解开线程的堆栈。
答案 2 :(得分:0)
这样做并不标准化。似乎有些实现有,有些却没有。
如果可以,应该避免使用pthread_cancel();它实际上并没有停止线程,直到它到达取消点,这通常是任何其他pthread_ *调用。特别是,在许多平台上,取消不会中断阻塞读取。答案 3 :(得分:0)
#include<iostream>
#include<pthread.h>
class obj
{
public:
obj(){printf("constructor called\n");}
~obj(){printf("destructor called\n");}
};
void *runner(void *param)
{
printf("In the thread\n");
obj ob;
puts("sleep..");
sleep(4);
puts("woke up");
pthread_exit(0);
}
int main(int argc,char *argv[])
{
int i,n;
puts("testing pkill");
pthread_attr_t attr;
pthread_t tid;
//create child thread with default attributes
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,0);
pthread_cancel(tid);
pthread_join(tid,NULL);//wait till finished
//the parent process outputs value
return 0;
}
虽然与上述观点不一致,但以下代码输出
testing pkill In the thread constructor called sleep.. destructor called