我在写一个多线程的C++程序。我打算杀死线程。但是,我也使用ref计数的GC。我想知道当一个线程被杀死时,堆栈分配的对象是否会被破坏。当我杀死C++中的pThread时,栈上的对象的析构函数会被调用吗?
11
A
回答
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
相关问题
- 1. C++ - 当矢量持有对象时调用析构函数吗?
- 2. 当一个窗口关闭时,我的析构函数会被调用吗?
- 3. 调用finish()后活动对象何时真的被杀死?
- 4. C++堆栈分配对象,显式析构函数调用
- 5. 对象是否会被杀死?
- 6. 可以在另一个对象的析构函数中调用被销毁的对象的成员函数吗?
- 7. 函数调用中的堆栈对象何时构建?
- 8. 当父进程被“kill -9”杀死时,子进程是否也会被杀死?
- 9. C++堆栈分配的对象分配和析构函数调用
- 10. dylib析构函数不会被调用
- 11. 调用堆栈上大对象的构造函数
- 12. C++ thread_local析构函数与pthread析构函数
- 13. C++析构函数没有被调用?
- 14. 当应用程序已被杀死时,避免应用程序尝试调用碎片的空构造函数
- 15. 析构函数的对象后不会被调用超出范围
- 16. 保存当活动被杀死所接收的包对象
- 17. C++太多的析构函数调用,所以几个对象
- 18. boost :: python包装对象的C++析构函数调用
- 19. 如果对象在构造函数中抛出异常,基类的析构函数会调用吗?
- 20. 当变量仍然活着时被调用的C++析构函数
- 21. 杀死线程在pthread库
- 22. gc-lua对象上的析构函数
- 23. 为什么我的Knockout映射会杀死我的$ .change函数?
- 24. 为什么当我向实例添加实例时,我的类的析构函数会被调用?
- 25. 杀死等待条件变量的pthread
- 26. C# - Timer的实例何时会被杀死?
- 27. 在什么情况下C++析构函数不会被调用?
- 28. 为什么析构函数不会在你要返回的对象上调用?
- 29. 当堆栈中声明对象时,你能保证析构函数的顺序吗?
- 30. 当在js模块中定义对象构造函数时,从C调用JS对象构造函数
你随时可以测试..:P – sud03r 2010-01-29 15:54:39
@Neeraj测试并不总是说实话。 – AraK 2010-01-29 15:55:58
确实。实际上测试经常说谎。请记住,在一个编译器/平台/机器上工作的可能不适用于另一个。同时请记住,并不总是遵循标准,所以对此类问题的正确答案是:研究与测试。 – Toji 2010-01-29 16:10:32