一个简单的多线程下的singleton实现

来源:互联网 发布:怎么修改淘宝域名 编辑:程序博客网 时间:2024/05/17 03:03

首先看一个简单的单线程的单例模式

(1)构造函数私有化

(2)提供一个全局的静态方法(静态访问点)

(3)在类中定义一个静态指针,指向本类的变量 的静态变量指针

#include<iostream>using namespace std;class singelton{public:static singelton* getinstance(){if (m_psl == NULL){m_psl = new singelton;}return m_psl;}static void free_instance(){if (m_psl != NULL){delete m_psl;}m_psl = NULL;}private:singelton(){cout << "singelton contructor" << endl;}private:static singelton  *m_psl;};int main(){singelton* ps1 = singelton::getinstance();singelton* ps2 = singelton::getinstance();if (ps1 == ps2){cout << "the same" << endl;}else{cout << "diffence" << endl;}system("pause");return 0;}

都知道多线程下,全局的变量访问顺序都是随机的,对于 单例变量也是如此,不加锁就会在每个线程中都创建一个实例,此时就不是单例了

如下是一个简单的多线程下的单例实现(win)


#include"windows.h"#include"winbase.h"#include<process.h>using namespace std;CRITICAL_SECTION  cs;  //定义一个临界区变量 ,用来对singleton的初始化函数加锁class singleton{private:singleton() //多线程下不是线程安全函数{cout << "构造函数" << endl;//Sleep(1000);}~singleton();public:static singleton* get_singleton(){EnterCriticalSection(&cs);  // 开始加锁,在没有解锁前只有一个线程可以访问if (single == NULL){count++;single = new singleton();}LeaveCriticalSection(&cs);  //解锁 //另一种double check的方法/*-----------------------------------if (single == NULL){EnterCriticalSection(&cs);  if (single == NULL){count++;single = new singleton();}LeaveCriticalSection(&cs);  }-----------------------------------*/return single;}static singleton *release_singleton(){if (single != NULL){delete single;single = NULL;}}static void print(){cout << "singleton print test" << endl;}private:static singleton* single;static int count;};singleton* singleton::single = NULL;int singleton::count = 0;void main01(){singleton* ps1 = singleton::get_singleton();singleton* ps2 = singleton::get_singleton();if (ps1 == ps2){cout << "the same" << endl;}else{cout << "diffence" << endl;}}void  myfunc(void *){//cout << "线程函数开始" << endl;  不会清空缓冲区cout << "线程函数开始\n";singleton::get_singleton()->print();}int _tmain(int argc, _TCHAR* argv[]){//main01();//_CRTIMP uintptr_t __cdecl _beginthread (_In_ void (__cdecl * _StartAddress) (void *),//_In_ unsigned _StackSize, _In_opt_ void * _ArgList);InitializeCriticalSection(&cs);HANDLE hThread[10];for (int i = 0; i < 3; i++){hThread[i] = (HANDLE)_beginthread(myfunc, 0, NULL);}int i = 0;for (; i < 3; i++){//等待 所有子线程均运行完毕后执行下面的代码//INFINITE 表示 死等 WaitForSingleObject(hThread[i],INFINITE);}system("pause");return 0;}


0 0
原创粉丝点击