C++设计模式基础教程(3)

2018-11-17 18:52

11

// NULL == m_instance,使程序相对开销增大。 //2多线程中会导致多个实例的产生,从而导致运行代码不正确以及内存的泄露。 //3提供释放资源的函数 return single; } static Singelton *releaseSingelton() { if (single != NULL) //需要判断 { cout<<\释放资源\\n\ delete single; single = NULL; } return single; } void pirntS() //测试函数 { printf(\ } private: static Singelton *single; static int count; }; //note 静态变量类外初始化 Singelton *Singelton::single = new Singelton(); int Singelton::count = 0; int _tmainTTT(int argc, _TCHAR* argv[]) { Singelton *s1 = Singelton::getSingelton(); Singelton *s2 = Singelton::getSingelton(); if (s1 == s2) { cout<<\ } else { cout<<\ } s1->pirntS(); Singelton::releaseSingelton(); 12

cout <<\ system(\ return 0; } unsigned int threadfunc2(void *myIpAdd) { int id = GetCurrentThreadId(); printf(\ return 1; } void threadfunc(void *myIpAdd) { int id = GetCurrentThreadId(); printf(\ Singelton::getSingelton()->pirntS(); return ; } int _tmain(int argc, _TCHAR* argv[]) { int i = 0; DWORD dwThreadId[201], dwThrdParam = 1; HANDLE hThread[201]; int threadnum = 3; for (i=0; i

} for (i=0; i

新建MFC对话框应用程序。 方便使用临界区类对象,同步线程 // MFC Diagram 应用程序 #include \#include \单例优化.h\#include \单例优化Dlg.h\#include \ #include %using namespace std; //临界区 static CCriticalSection cs; //man pthread_create() class Singleton { private: Singleton() { TRACE(\ Sleep(1000); TRACE(\ } Singleton(const Singleton &); Singleton& operator = (const Singleton &); public: static void printV() { 14

TRACE(\ } //请思考;懒汉式的Double-Check是一个经典问题!为什么需要2次检查 “if(pInstance == NULL)” 场景:假设有线程1、线程2、线程3,同时资源竞争。 //1)第1个、2个、3个线程执行第一个检查,都有可能进入黄色区域(临界区) //2)若第1个线程进入到临界区,第2个、第3个线程需要等待 //3)第1个线程执行完毕,cs.unlock()后,第2个、第3个线程要竞争执行临界区代码。 //4)假若第2个线程进入临界区,此时第2个线程需要再次判断if(pInstance == NULL)”,若第一个线程已经创建实例;第2个线程就不需要再次创建了。保证了单例; //5)同样道理,若第2个线程,cs.unlock()后,第3个线程会竞争执行临界区代码;此时第3个线程需要再次判断 if(pInstance == NULL)。通过检查发现实例已经new出来,就不需要再次创建;保证了单例。 static Singleton *Instantialize() { if(pInstance == NULL) //double check { cs.Lock(); //只有当pInstance等于null时,才开始使用加锁机制 二次检查 if(pInstance == NULL) { pInstance = new Singleton(); } cs.Unlock(); } return pInstance; } static Singleton *pInstance; }; Singleton* Singleton::pInstance = 0; void CMy01单例优化Dlg::OnBnClickedButton1() { CCriticalSection cs; cs.Lock(); cs.Unlock(); // TODO: 在此添加控件通知处理程序代码 } void threadfunc(void *myIpAdd) 15

{ int id = GetCurrentThreadId(); TRACE(\ Singleton::Instantialize()->printV(); //Singelton::getSingelton()->pirntS(); } void CMy01单例优化Dlg::OnBnClickedButton2() { int i = 0; DWORD dwThreadId[201], dwThrdParam = 1; HANDLE hThread[201]; int threadnum = 3; for (i=0; i

C++设计模式基础教程(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:二类城市语言文字学校迎检工作要点及分工

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: