muduo_base库学习笔记8——线程安全的单例类实现、pthread_once、atexit、typedef char T_must_be_<font color = orange>compl..

2023-11-03

了解单例模式:

实际应用中,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中只有一个打印程序的实例。
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。

关于pthread_once

#include <pthread.h>

int pthread_once(pthread_once_t *once_control,
                 void (*init_routine)(void));
pthread_once_t once_control = PTHREAD_ONCE_INIT;

本函数使用初值为PTHREAD_ONCE_INITonce_control变量保证init_routine()函数在本进程执行序列中仅执行一次,且能保证线程安全。(我们还能用互斥锁的方式来实现线程安全,但效率没有pthread_once高)

关于atexit

// atexit()函数用来注册程序正常终止时要被调用的函数
// 在一个程序中最多可以用atexit()注册32个处理函数
// 这些处理函数的调用顺序与其注册的顺序相反
// 即最先注册的最后调用,最后注册的最先调用

#include<stdlib.h>

int atexit(void (*func)(void));  // 登记的函数类型为不接受任何参数的void函数

Singleton.h中,atexit函数被用于注册一个销毁函数,在程序结束的时候会自动调用销毁函数,就不用手动调用了。

typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1]

在C++中,类型有Complete typeIncomplete type之分,对于Complete type, 它的大小在编译时是可以确定的,而对于Incomplete type, 它的大小在编译时是不能确定的。

delete删除一个只有声明但无定义的类型的指针(即不完整类型)是危险的。这通常导致无法调用析构函数(包括对象本身的析构函数、成员/基类的析构函数),从而泄露资源。
而通过 typedef char T_must_be_complete_type[sizeof(T) == [0 ? -1 : 1]; 这种做法能使当T为不完整类型时编译报错。(当T为不完整类型时,sizeof(T)给出的是0,根据代码规则,-1是不能作为数组的size的,因此这里相当于强制编译器给出error而不是 warning)

muduo用pthread_once实现线程安全的Singleton

在这里插入图片描述
ponce能够保证一个对象只被执行一次,instance返回单例对象

template<typename T>
class Singleton : boost::noncopyable
{
public:
    static T& instance()
    {
        pthread_once(&ponce_, &Singleton::init);//只被初始化一次
        return *value_;
    }

private:
    Singleton();
    ~Singleton();
    static void init()
    {
        value_ = new T();
    }

    static pthread_once_t ponce_;
    static T* value_;
};

template<typename T>
pthread_once_t Singleton::ponce_ = PTHREAD_ONCE_INIT;

template<typename T>
T* Singleton<T>::value_ = NULL;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

muduo_base库学习笔记8——线程安全的单例类实现、pthread_once、atexit、typedef char T_must_be_<font color = orange>compl.. 的相关文章

随机推荐