`
rcfalcon
  • 浏览: 228662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++类的静态成员函数在多线程的工作机制以及运行过程中强制结束线程实验

阅读更多
当时为了测试类的静态成员函数在多线程的工作机制以及运行过程中强制结束线程,

自己写了个小程序。


直接强制结束还是很危险的,很可能由于互斥锁而导致死锁。

还可能会导致线程的资源无法释放,存在内存垃圾。


OK。贴一下,供需要的人参考

//结论:类静态成员函数可以被多线程多次启用,互不干涉
//运行过程中可以强制结束线程,但是要慎用!很可能由于互斥锁导致死锁
//网上说用该方法还可能导致资源无法正常释放(可能也是由于互斥问题)

#include 
#include 

using namespace std;

class A;

struct Trans
{
	Trans()
		: id( 0 )
		, pFather( 0 )
	{}
	int id;
	A* pFather;
};

class A
{
public:
	A( int id )
		: m_Id( id )
		, m_TaskHandler( 0 )
	{
	}

	~A()
	{
		coutid;
		A* p = pdata->pFather;
		for(int i=0;iFinish();
		return 0;
	}

private:
	int m_Id;
	HANDLE m_TaskHandler;
	Trans m_Data;
};

void main()
{
	A a(1);
	A b(2);
	a.Run();
	b.Run();
	Sleep( 200 );
	a.ForceStop();

	system("pause");
}

分享到:
评论

相关推荐

    vc多线程编程简单介绍vc多线程编程简单介绍vc多线程编程简单介绍

    在Windows平台上,Visual C++(简称VC)是微软公司提供的一种强大的C++开发工具,它支持多线程编程,使得开发者能够创建同时执行多个任务的应用程序。多线程编程是现代软件开发中的一个重要概念,特别是在处理大数据...

    详解C++ thread用法总结

    C++中的thread类是C++11标准引入的,用于在C++程序中创建和管理线程。它被定义在头文件中,是C++标准库的一部分。通过使用std::thread类,程序员可以创建新的线程来执行特定的任务,从而实现程序的多线程并行处理。 ...

    挑战30天C++极限

    5. **静态数据成员与静态成员函数**:静态成员在类的所有对象之间共享,不依赖于特定对象的存在,提高了代码的效率和资源管理。 6. **友元**:友元函数或友元类可以访问类的私有和保护成员,打破了封装性,但有时...

    C++相关高频经典面试题100问.pdf

    - **实现**:通过成员函数或非成员函数形式定义。 #### 9. 多继承与虚继承 - **多继承**:一个类可以从多个基类派生。 - **虚继承**:解决“钻石问题”,确保派生类只继承一个基类实例。 #### 10. 命名空间 - **...

    C++_Interview_Questions

    1. **对象(Object)**:在C++中,对象是类的实例,它包含数据(成员变量)和行为(成员函数)。对象是面向对象编程的基础。 2. **多态性(Polymorphism)**:多态性允许不同类型的对象对同一消息作出不同的响应。C++...

    软件编程词汇表(一些编程词汇的解释)

    受保护区域是指在多线程环境中,为了防止并发访问而导致的数据不一致性,而使用同步机制(如锁)保护的代码段。通过确保每次只有一个线程可以访问受保护区域,可以有效地避免竞态条件。 #### 33. 堆 (Heap) 堆是...

    C++常见面试题

    在面试中,C++的知识点考察通常包括语言特性、内存管理、模板、STL、异常处理、多线程、对象模型等。以下是一些常见的C++面试题及解析: 1. `sizeof`运算符: - `sizeof`用于计算类型或变量占用的内存大小。对于...

    C++题目汇总终稿 70.pdf

    - 在成员函数前使用`static`,表示该函数是静态成员函数,可以通过类名直接调用。 ### const关键字的作用 - 修饰成员变量,表示该变量是只读的。 - 修饰函数参数,表示该参数不可修改。 - 修饰成员函数,表示该...

    Java经典问题答案(带书签).pdf

    - C++中虚类可以包含虚函数,这些函数可以在派生类中被重写。 **类初始化顺序** - 类初始化按照继承层次结构从父类到子类依次进行。 - 静态成员先于实例成员初始化。 **普通代码块、静态代码块、构造代码块的区别...

    Android面试常见问题

    5. 类成员函数的重载、覆盖和隐藏区别: - 重载发生在同一类中,与方法签名(名称+参数列表)有关。 - 覆盖发生在子类中,与父类的虚方法相关。 - 隐藏是指子类有与父类同名但非虚的方法,这不会触发重写,而是...

    java笔试题汇总.pdf

    8. Java是严格的面向对象语言,不允许单独的过程与函数存在,所有功能都封装在类中。方法属于类的成员,必须隶属于某个类。 9. 能被java.exe运行的类文件必须包含main()方法,这是Java应用程序的入口点。J2SDK...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    CoreJava学习笔记

    内部类是在另一个类内部定义的类,根据定义的位置不同,可以分为成员内部类、局部内部类、静态内部类和匿名内部类。 **集合:** 集合框架提供了一种灵活的方式来存储和操作一组对象。Java中的集合框架主要包括List...

    Java经典面试题+答案(带书签)pdf

    多线程中stop为什么不合适** - `stop`方法已被废弃,因为它可能导致数据不一致等问题。 - 更安全的做法是使用标志位控制线程的运行。 **7. 同步代码块和同步方法的区别** - **同步代码块**:通过`synchronized`...

    经典的问题

    - 类初始化顺序涉及静态块、静态字段、非静态块、非静态字段和构造函数的执行顺序。 **15. 普通代码块、静态代码块、构造代码块区别** - **静态代码块**: 在类加载时只执行一次。 - **构造代码块**: 在每次创建...

    C# 快速学习 简短但全面的方式讨论了 C# 语言构造和特性

    虽然本文不涵盖C++与C#的共同点、垃圾回收、线程、文件处理、数据类型转换、异常处理以及.NET库编程,这些都是C#开发中不可或缺的知识点,建议在后续的学习中深入理解。 总之,C#结合了C++的高效性和Java的易用性,...

    java面试题希望对面试的有帮助

    匿名内部类的使用方式,静态嵌套类与内部类的区别,`HashMap`与`Hashtable`的不同之处,`Collection`与`Collections`的区别,`assert`语句的应用场景,以及关于字符串、内存管理、数学函数、线程控制等方面的问题。...

Global site tag (gtag.js) - Google Analytics