2010-01-29 172 views
11

我在写一个多线程的C++程序。我打算杀死线程。但是,我也使用ref计数的GC。我想知道当一个线程被杀死时,堆栈分配的对象是否会被破坏。当我杀死C++中的pThread时,栈上的对象的析构函数会被调用吗?

+1

你随时可以测试..:P – sud03r 2010-01-29 15:54:39

+2

@Neeraj测试并不总是说实话。 – AraK 2010-01-29 15:55:58

+1

确实。实际上测试经常说谎。请记住,在一个编译器/平台/机器上工作的可能不适用于另一个。同时请记住,并不总是遵循标准,所以对此类问题的正确答案是:研究与测试。 – Toji 2010-01-29 16:10:32

回答

15

当你'杀死'一个线程时,堆栈并不放松。

杀死线程不是一种可靠的操作方式 - 它们打开的资源(如文件)在进程关闭前保持打开状态。此外,如果他们在关闭锁时打开任何锁,则锁可能会保持锁定状态。请记住,您可能会调用很多您无法控制的平台代码,并且您无法始终看到这些内容。

关闭一个线程的优雅健壮的方法是中断它 - 通常它将轮询以查看它是否被告知定期关闭,或者它正在运行一个消息循环并发送一条退出消息。

1

我怀疑它 - pthread是一个纯C api,所以我怀疑它会有任何机制来展开线程的堆栈。

0

这样做没有标准化。看起来有些实现有,有些则没有。

pthread_cancel()真的应该避免,如果可以的话;它不会实际上停止线程,直到它达到取消点,这通常是其他任何pthread_ *调用。特别是,在许多平台上,取消不会中断读取。

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 
+0

你打断了睡眠,没有杀死它 – Will 2010-01-29 16:18:19

相关问题