栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

笔记

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

笔记

单例设计模式共享数据

设计模式,把项目开发经验总结,模块化。
单例模式:
整个项目中,有某个或者某些特殊类,属于该类的对象,有且只能创建一个。

class mySys
{
public:
    static mySys* GetInstance()
    {
        if (m_instance == nullptr)
        {
            m_instance = new mySys;
            static GC cl;
        }
        return m_instance;
    }
    class GC
    {
    public:
        ~GC()
        {
            if (mySys::m_instance)
            {
                delete mySys::m_instance;
                mySys::m_instance = nullptr;
            }
        }
    };
private:
    mySys(){}//私有化构造不能创建
private:
    static mySys* m_instance;
};
mySys* mySys::m_instance = nullptr;
int main()
{
    mySys* demo = mySys::GetInstance();
    mySys* demo2 = mySys::GetInstance();
    return 0;
}


回顾:static的声明周期是到程序结束运行,那么等程序结束时候自然会调用GC这个类的析构,把这个内存释放掉。

单例在线程中的应用,防止锁死的办法

std::mutex resource_mutex;
class mySys
{
public:
    static mySys* GetInstance()
    {
        if (m_instance == NULL)
        {
            std::unique_lock myobj(resource_mutex);
            if (m_instance == NULL)
            {
                m_instance = new mySys;
                static GC cl;
            }
        }
        return m_instance;
    }
    class GC
    {
    public:
        ~GC()
        {
            if (mySys::m_instance)
            {
                delete mySys::m_instance;
                mySys::m_instance = NULL;
            }
        }
    };
public:
    void fun()
    {
        cout << "test" << endl;
    }
private:
    mySys(){}//私有化构造不能创建
private:
    static mySys* m_instance;
};
mySys* mySys::m_instance = nullptr;
void mythread()
{
    mySys::GetInstance()->fun();
    cout << "Success" << endl;
}
int main()
{
    
    std::thread x1(mythread);
    std::thread x2(mythread);
    x1.join();
    x2.join();
    return 0;
}


同一个线程入口函数,都执行了单例创建,加上了锁做判定,并优化代码提高了运行效率(双重锁定)

std::call_once

设置一个call_flag,一个自己的标记,修改单例类,也可以用call_once来代替锁

std::once_flag myflag;//设置flag
class mySys
{
public:
    static void CreatInstance()
    {
        m_instance = new mySys;
        static GC cl;
    }
public:
    static mySys* GetInstance()
    {
        std::call_once(myflag, CreatInstance);//执行call_once
        return m_instance;
    }
    class GC
    {
    public:
        ~GC()
        {
            if (mySys::m_instance)
            {
                delete mySys::m_instance;
                mySys::m_instance = NULL;
            }
        }
    };
public:
    void fun()
    {
        cout << "test" << endl;
    }
private:
    mySys(){}//私有化构造不能创建
private:
    static mySys* m_instance;
};
mySys* mySys::m_instance = nullptr;
void mythread()
{
    mySys::GetInstance()->fun();
    cout << "Success" << endl;
}
int main()
{
    
    std::thread x1(mythread);
    std::thread x2(mythread);
    x1.join();
    x2.join();
    return 0;
}
std::condition_variable

条件参数
wait();作用,用来等一个东西
简单来说,
如果wait有第二个参数,就判断这个表达式,为false,就休眠等待有函数调用notify_one这个方法
如果第二个参数返回TRUE,wait就返回,在上锁的情况下执行后面代码
如果没有第二个参数,wait返回,跟false一致,会先解锁,但是会阻塞到此行,直到有函数调用notify_one这个方法为止。代码如下:

std::condition_variable mycond;
class RecvA
{
public:

    void inMsgRecvQueue()
    {
        for (int i = 0; i < 1000; i++)
        {
            cout << "插入元素" << i << endl;
            std::unique_lock sdgard(my_mutex);
            msgRecvQueue.push_back(i);
            mycond.notify_one();//把wait线程唤醒
        }
        return;
    }

    void outMsgRecvQueue()
    {
        int commond = 0;
        while (true)
        {
            std::unique_lock sdgard(my_mutex);
            mycond.wait(sdgard, [this]()->bool
            {
                if (!msgRecvQueue.empty())
                {
                    return true;
                }
                return false;
            });
            commond = msgRecvQueue.front();//先进先出
            msgRecvQueue.pop_front();//移除掉第一个已经取出的元素
            cout << "取数据成功:" << commond << endl;
            sdgard.unlock();//此处提前解锁
        }
    }
private:
    std::list msgRecvQueue;//接收的信息
    std::mutex my_mutex;
};
int main()
{
    RecvA myobj;
    std::thread outRec(&RecvA::outMsgRecvQueue, &myobj);
    std::thread inRec(&RecvA::inMsgRecvQueue, &myobj);
    outRec.join();
    inRec.join();
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629345.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号