青岛市北建设集团网站,网站怎么设置二级域名,天津建设网站安全员考试成绩查询,郑州网站建设外贸目录
一、unique_lock
二、智能指针 #xff08;其实是一个类#xff09;
三、工厂模式 一、unique_lock
参考文章【1】#xff0c;了解unique_lock与lock_guard的区别。
总结:unique_lock使用起来要比lock_guard更灵活#xff0c;但是效率会第一点#xff0c;内存的…目录
一、unique_lock
二、智能指针 其实是一个类
三、工厂模式 一、unique_lock
参考文章【1】了解unique_lock与lock_guard的区别。
总结:unique_lock使用起来要比lock_guard更灵活但是效率会第一点内存的占用也会大一点。
1.unique_lock的定义
std::mutex mlock;
std::unique_lockstd::mutex munique(mlock);
第二个参数可以是std::adopt_lock
std::unique_lockstd::mutex munique(mlock,std::adopt_lock);
使用unique_lock和mutex来实现互斥锁。unique_lock在构造函数中获取锁析构函数中释放锁。adopt_lock参数告诉unique_lock构造函数锁已经被其他线程获取unique_lock不需要再次获取锁而是直接将锁的所有权转移给它自己。这样做的好处是可以避免死锁因为uniquelock的析构函数会在任何情况下都释放锁即使在发生异常的情况下也是如此。
也可以是std::try_to_lock
std::unique_lockstd::mutex munique(mlock, std::try_to_lock);
如果有一个线程被锁住而且执行时间很长那么另一个线程一般会被阻塞在那里反而会造成时间的浪费。那么使用了try_to_lock后如果被锁住了它不会在那里阻塞等待它可以先去执行其他没有被锁的代码。
也可以是std::defer_lock
std::unique_lockstd::mutex munique(mlock, std::defer_lock);
表示暂时先不lock之后手动去lock。一般与unique_lock的成员函数搭配使用
2.unique_lock的成员函数
lock() 与 unlock()
当使用了defer_lock参数时在创建了unique_lock的对象时就不会自动加锁那么就需要借助lock这个成员函数来进行手动加锁当然也有unlock来手动解锁。
try_lock()判断是否能拿到锁如果拿不到锁返回false,如果拿到了锁返回true
release():解除unique_lock和mutex对象的联系并将原mutex对象的指针返回出来。如果之前的mutex已经加锁需在后面自己手动unlock解锁
std::unique_lockstd::mutex munique(mlock); // 这里是自动lock
std::mutex *m munique.release();
....
m-unlock(); std::thread t1(work1, std::ref(ans));
std::ref是C标准库中的一个函数模板用于将一个对象包装成一个引用。这个函数模板的作用是将一个对象的引用传递给一个函数而不是将对象本身传递给函数。这样做的好处是可以避免对象的拷贝提高程序的效率。 代码块中std::ref被用于将ans对象包装成一个引用并将这个引用传递给work1函数的线程。这样做的目的是让work1函数在线程中对ans对象进行操作而不是对ans对象的拷贝进行操作。 二、智能指针 其实是一个类
智能指针主要用于管理在堆上分配的内存它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后会在析构函数中释放掉申请的内存从而防止内存泄漏。
C 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1当过期时引用计数减一。只有引用计数为0时智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针因为一个是指针一个是类。可以通过make_shared函数或者通过构造函数传入普通指针。并可以通过get函数获得普通指针。
1.unique_ptr
unique_ptr保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露以new创建对象后因为发生异常而忘记调用delete特别有用。
两个unique_ptr 不能指向一个对象即 unique_ptr 不共享它所管理的对象。它无法复制到其他 unique_ptr无法通过值传递到函数。
#include iostream
#include string
#include memory
int main() {std::unique_ptrstd::string ps1, ps2;ps1 std::make_uniquestd::string(hello);ps2 std::move(ps1);ps1 std::make_uniquestd::string(alexia);std::cout *ps2 *ps1 std::endl;return 0;
}
2.shared_ptr
shared_ptr 允许多个指针指向同一个对象。利用引用计数的方式实现了对所管理的对象的所有权的分享即允许多个 shared_ptr 共同管理同一个对象当引用计数为 0 的时候自动释放资源。
成员函数
use_count 返回引用计数的个数
unique 返回是否是独占所有权
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.如
shared_ptrint sp(new int(1));
sp 与 sp.get()是等价的。 3.weak_ptr
share_ptr虽然已经很好用了但是有一点share_ptr智能指针还是有内存泄露的情况当两个对象相互使用一个shared_ptr成员变量指向对方会造成循环引用使引用计数失效从而导致内存泄漏。
weak_ptr 被设计为与 shared_ptr 共同工作可以从一个 shared_ptr 或者另一个 weak_ptr 对象构造而来。weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针它更像是 shared_ptr 的一个助手而不是智能指针因为它不具有普通指针的行为没有重载 operator* 和 operator- 因此取名为 weak表明其是功能较弱的智能指针。它的最大作用在于协助 shared_ptr 工作可获得资源的观测权像旁观者那样观测资源的使用情况。观察者意味着 weak_ptr 只对 shared_ptr 进行引用而不改变其引用计数当被观察的 shared_ptr 失效后相应的 weak_ptr 也相应失效。
使用方法
使用 weak_ptr 的成员函数 use_count() 可以观测资源的引用计数。注意weak_ptr不增加引用计数
另一个成员函数 expired() 的功能等价于 use_count()0表示被观测的资源也就是 shared_ptr 管理的资源已经不复存在。
weak_ptr 可以使用一个非常重要的成员函数lock()从被观测的 shared_ptr 获得一个可用的 shared_ptr 管理的对象 从而操作资源。但当 expired()true 的时候lock() 函数将返回一个存储空指针的 shared_ptr。总的来说weak_ptr 的基本用法总结如下
shared_ptrint sp(new int(1));
weak_ptrT w; //创建空 weak_ptr可以指向类型为 T 的对象
weak_ptrT w(sp); //与 shared_ptr 指向相同的对象shared_ptr 引用计数不变。T必须能转换为 sp 指向的类型
wp; //p 可以是 shared_ptr 或 weak_ptr赋值后 w 与 p 共享对象
w.reset(); //将 w 置空
w.use_count(); //返回与 w 共享对象的 shared_ptr 的数量
w.expired(); //若 w.use_count() 为 0返回 true否则返回 false
w.lock(); //如果 expired() 为 true返回一个空 shared_ptr否则返回非空 shared_ptr#include assert.h#include iostream
#include memory
#include stringusing namespace std;int main() {shared_ptrint sp(new int(10));assert(sp.use_count() 1);weak_ptrint wp(sp); // 从 shared_ptr 创建 weak_ptrassert(wp.use_count() 1);if (!wp.expired()) { // 判断 weak_ptr 观察的对象是否失效shared_ptrint sp2 wp.lock(); //使用 wp.lock() 创建一个新的 shared_ptr 时它又增加了一次引用计数 *sp2 100;assert(wp.use_count() 2);}assert(wp.use_count() 1); //在 if 语句块之外wp.use_count() 的值仍然是1因为 weak_ptr 并不会增加引用计数。cout int: *sp endl;return 0;
}这段代码主要演示了如何使用 weak_ptr 来避免循环引用的问题。在这个例子中我们创建了一个 shared_ptr 对象 sp然后通过 weak_ptr 对象 wp 来观察 sp。如果 sp 被销毁了那么 wp 也会自动失效。在代码中我们通过 wp.expired() 来判断 wp 是否失效如果没有失效我们就可以通过 wp.lock() 来获得一个 shared_ptr 对象 sp2然后修改 sp2 所指向的值。最后我们通过 use_count() 来检查 sp 和 wp 的引用计数是否正确。
4.如何选择智能指针
1如果程序要使用多个指向同一个对象的指针应选择 shared_ptr 将指针作为参数或者函数的返回值进行传递的话应该使用 shared_ptr两个对象都包含指向第三个对象的指针此时应该使用 shared_ptr 来管理第三个对象STL 容器包含指针。很多 STL 算法都支持复制和赋值操作这些操作可用于 shared_ptr但不能用于 unique_ptr编译器发出 warning和 auto_ptr行为不确定。如果你的编译器没有提供 shared_ptr可使用 Boost 库提供的 shared_ptr。 2如果程序不需要多个指向同一个对象的指针则可使用 unique_ptr。如果函数使用 new 分配内存并返还指向该内存的指针将其返回类型声明为 unique_ptr 是不错的选择。
3为了解决 shared_ptr 的循环引用问题使用 weak_ptr。
参考【2】【3】 三、工厂模式
工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。
1.简单工厂模式
简单工厂模式又叫静态方法模式因为工厂类定义了一个静态方法。
将“类实例化的操作”与“使用对象的操作”分开让使用者不用知道具体参数就可以实例化出所需要的“产品”类从而避免了在客户端代码中显式指定实现了解耦。也就是说使用者可直接消费产品而不需要知道其生产的细节。
模式组成
组成关系 作用抽象产品Product具体产品的父类描述产品的公共接口具体产品Concrete Product抽象产品的子类工厂类创建的目标类描述生产的具体产品工厂Factor被外界调用根据传入不同参数从而创建不同具体产品类的实例
使用步骤 创建抽象产品类Product 定义产品的公共接口创建具体产品类继承抽象产品类定义生产的具体产品创建工厂类通过创建静态方法传入不同参数从而创建不同具体产品类的实例外界通过调用工厂类的静态方法传入不同参数从而创建不同具体产品类的实例 实列某加工厂推出三个产品使用简单工厂模式实现三种产品的生成
①创建抽象产品类Product
class Product
{
public:virtual void Show() 0;
};
②创建具体产品类继承抽象产品类
class ProductA : public Product
{
public:void Show(){coutIm ProductAendl;}
};class ProductB : public Product
{
public:void Show(){coutIm ProductBendl;}
};class ProductC : public Product
{
public:void Show(){coutIm ProductCendl;}
};③创建工厂类通过创建静态方法传入不同参数从而创建不同具体产品类的实例。
typedef enum ProductTypeTag
{TypeA,TypeB,TypeC
}PRODUCTTYPE;class Factory
{
public:static Product* CreateProduct(PRODUCTTYPE type){switch (type){case TypeA:return new ProductA();case TypeB:return new ProductB();case TypeC:return new ProductC();default:return NULL;}}
};
④外界通过调用工厂类的静态方法传入不同参数从而创建不同具体产品类的实例
int main(int argc, char *argv[])
{//创造工厂对象Factory *ProductFactory new Factory();//从工厂对象创造产品A对象Product *productObjA ProductFactory-CreateProduct(TypeA);if (productObjA ! NULL)productObjA-Show();Product *productObjB ProductFactory-CreateProduct(TypeB);if (productObjB ! NULL)productObjB-Show();Product *productObjC ProductFactory-CreateProduct(TypeC);if (productObjC ! NULL)productObjC-Show();delete ProductFactory;ProductFactory NULL;delete productObjA;productObjA NULL;delete productObjB;productObjB NULL; delete productObjC;productObjC NULL;return 0;
} 优缺点 优点 把初始化实例时的工作放到工厂里进行使代码更容易维护。将“类实例化的操作”与“使用对象的操作”分开让使用者不用知道具体参数就可以实例化出所需要的“产品”类 缺点 工厂类集中了所有实例产品的创建逻辑一旦这个工厂不能正常工作整个系统都会受到影响违背“开放 - 关闭原则”一旦添加新产品就不得不修改工厂类的逻辑这样就会造成工厂逻辑过于复杂。简单工厂模式由于使用了静态工厂方法静态方法不能被继承和重写会造成工厂角色无法形成基于继承的等级结构。 2.工厂方法模式
针对简答工厂模式问题设计了工厂方法模式。工厂父类负责定义创建对象的公共接口而子类则负责生成具体的对象。
将类的实例化具体产品的创建延迟到工厂类的子类具体工厂中完成即由子类来决定应该实例化创建哪一个类。
之所以可以解决简单工厂的问题是因为工厂方法模式把具体产品的创建推迟到工厂类的子类具体工厂中此时工厂类不再负责所有产品的创建而只是给出具体工厂必须实现的接口这样工厂方法模式在添加新产品的时候就不修改工厂类逻辑而是添加新的工厂子类符合开放封闭原则。 模式组成
组成关系 作用抽象产品Product具体产品的父类描述具体产品的公共接口具体产品Concrete Product抽象产品的子类工厂类创建的目标类描述生产的具体产品抽象工厂Factor具体工厂的父类描述具体工厂的公共接口具体工厂Concrete Factor抽象工厂的子类被外界调用描述具体工厂
使用步骤 创建抽象产品类 定义具体产品的公共接口创建具体产品类继承抽象产品类定义生产的具体产品创建抽象工厂类定义具体工厂的公共接口创建具体工厂类继承抽象工厂类定义创建对应具体产品实例的方法外界通过调用具体工厂类的方法从而创建不同具体产品类的实例 实例某加工厂原来只生产A类产品但新的订单要求生产B类产品由于改变原来工厂的配置比较困难因此开设工厂B生产B类产品。
#include iostream
using namespace std;//1.创建抽象产品类
class Product
{
public:virtual void Show() 0;
};
//2.创建具体产品类继承抽象产品类)
class ProductA : public Product
{
public:void Show(){cout Im ProductAendl;}
};class ProductB : public Product
{
public:void Show(){cout Im ProductBendl;}
};//3.创建抽象工厂类
class Factory
{
public:virtual Product *CreateProduct() 0;
};//4.创建具体工厂类继承抽象工厂类定义创建对应具体产品实例的方法
class FactoryA : public Factory
{
public:Product *CreateProduct(){return new ProductA ();}
};class FactoryB : public Factory
{
public:Product *CreateProduct(){return new ProductB ();}
};//5.外界通过调用具体工厂类的方法从而创建不同具体产品类的实例
int main(int argc , char *argv [])
{Factory *factoryA new FactoryA ();Product *productA factoryA-CreateProduct();productA-Show();Factory *factoryB new FactoryB ();Product *productB factoryB-CreateProduct();productB-Show();if (factoryA ! NULL){delete factoryA;factoryA NULL;}if (productA ! NULL){delete productA;productA NULL;}if (factoryB ! NULL){delete factoryB;factoryB NULL;}if (productB ! NULL){delete productB;productB NULL;}system(pause);return 0;
}
优缺点 优点 符合开-闭原则。新增一种产品时只需要增加相应的具体产品类和相应的工厂子类即可。简单工厂模式需要修改工厂类的判断逻辑符合单一职责原则。每个具体工厂类只负责创建对应的产品。简单工厂中的工厂类存在复杂的switch逻辑判断不使用静态工厂方法可以形成基于继承的等级结构。简单工厂模式的工厂类使用静态工厂方法 缺点 添加新产品时除了增加新产品类外还要提供与之对应的具体工厂类系统类的个数将成对增加在一定程度上增加了系统的复杂度由于考虑到系统的可扩展性需要引入抽象层在客户端代码中均使用抽象层进行定义增加了系统的抽象性和理解难度一个具体工厂只能创建一种具体产品 3.抽象工厂模式
工厂方法模式存在一个严重的问题一个具体工厂只能创建一类产品而在实际过程中一个工厂往往需要生产多类产品。使用了一种新的设计模式抽象工厂模式。
定义创建一系列相关或相互依赖对象的接口而无须指定它们具体的类具体的工厂负责实现具体的产品实例。
允许使用抽象的接口来创建一组相关产品而不需要知道或关心实际生产出的具体产品是什么这样就可以从具体产品中被解耦。
模式组成
组成关系 作用抽象产品族AbstractProduct抽象产品的父类描述抽象产品的公共接口抽象产品Product具体产品的父类描述具体产品的公共接口具体产品Concrete Product抽象产品的子类工厂类创建的目标类描述生产的具体产品抽象工厂Factor具体工厂的父类描述具体工厂的公共接口具体工厂Concrete Factor抽象工厂的子类被外界调用描述具体工厂
使用步骤 创建抽象产品族类 定义抽象产品的公共接口创建抽象产品类 继承抽象产品族类定义具体产品的公共接口创建具体产品类继承抽象产品类 定义生产的具体产品创建抽象工厂类定义具体工厂的公共接口创建具体工厂类继承抽象工厂类定义创建对应具体产品实例的方法客户端通过实例化具体的工厂类并调用其创建不同目标产品的方法 创建不同具体产品类的实例 实例某厂有两个加工厂A和B分别生产鞋和衣服随着订单的增加A厂所在地有了衣服的订单B厂所在地有了鞋子的订单再开新的工厂显然是不现实的因此在原来的工厂增加生产需求的功能即A生产鞋衣服B生产衣服鞋。
#include iostream
using namespace std;
//这个代码没有抽象产品族类// 抽象产品A
class ProductA
{
public:virtual void Show() 0;
};//具体的产品
class ProductA1 : public ProductA
{
public:void Show(){coutIm ProductA1endl;}
};class ProductA2 : public ProductA
{
public:void Show(){coutIm ProductA2endl;}
};// 抽象产品B
class ProductB
{
public:virtual void Show() 0;
};class ProductB1 : public ProductB
{
public:void Show(){coutIm ProductB1endl;}
};class ProductB2 : public ProductB
{
public:void Show(){coutIm ProductB2endl;}
};// Factory
class Factory
{
public:virtual ProductA *CreateProductA() 0;virtual ProductB *CreateProductB() 0;
};//具体工厂A生产A1和B1
class Factory1 : public Factory
{
public:ProductA *CreateProductA(){return new ProductA1();}ProductB *CreateProductB(){return new ProductB1();}
};class Factory2 : public Factory
{ProductA *CreateProductA(){return new ProductA2();}ProductB *CreateProductB(){return new ProductB2();}
};int main(int argc, char *argv[])
{Factory *factoryObj1 new Factory1();ProductA *productObjA1 factoryObj1-CreateProductA();ProductB *productObjB1 factoryObj1-CreateProductB();productObjA1-Show();productObjB1-Show();Factory *factoryObj2 new Factory2();ProductA *productObjA2 factoryObj2-CreateProductA();ProductB *productObjB2 factoryObj2-CreateProductB();productObjA2-Show();productObjB2-Show();if (factoryObj1 ! NULL){delete factoryObj1;factoryObj1 NULL;}if (productObjA1 ! NULL){delete productObjA1;productObjA1 NULL;}if (productObjB1 ! NULL){delete productObjB1;productObjB1 NULL;}if (factoryObj2 ! NULL){delete factoryObj2;factoryObj2 NULL;}if (productObjA2 ! NULL){delete productObjA2;productObjA2 NULL;}if (productObjB2 ! NULL){delete productObjB2;productObjB2 NULL;}system(pause);return 0;
}
优缺点 优点 抽象工厂模式将具体产品的创建延迟到具体工厂的子类中这样将对象的创建封装起来可以减少客户端与具体产品类之间的依赖从而使系统耦合度低这样更有利于后期的维护和扩展新增一种产品类时只需要增加相应的具体产品类和相应的工厂子类即可 缺点 抽象工厂模式很难支持新种类产品的变化。因为抽象工厂接口中已经确定了可以被创建的产品集合如果需要添加新产品此时就必须去修改抽象工厂的接口这样就涉及到抽象工厂类的以及所有子类的改变 参考【4】 【5】 文章转载自: http://www.morning.mpsnb.cn.gov.cn.mpsnb.cn http://www.morning.tmxfn.cn.gov.cn.tmxfn.cn http://www.morning.qwfq.cn.gov.cn.qwfq.cn http://www.morning.pxbrg.cn.gov.cn.pxbrg.cn http://www.morning.kfldw.cn.gov.cn.kfldw.cn http://www.morning.drtgt.cn.gov.cn.drtgt.cn http://www.morning.jrqbr.cn.gov.cn.jrqbr.cn http://www.morning.swbhq.cn.gov.cn.swbhq.cn http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.lmfmd.cn.gov.cn.lmfmd.cn http://www.morning.jngdh.cn.gov.cn.jngdh.cn http://www.morning.lskrg.cn.gov.cn.lskrg.cn http://www.morning.jqswf.cn.gov.cn.jqswf.cn http://www.morning.fsrtm.cn.gov.cn.fsrtm.cn http://www.morning.lydtr.cn.gov.cn.lydtr.cn http://www.morning.gqdsm.cn.gov.cn.gqdsm.cn http://www.morning.fbpdp.cn.gov.cn.fbpdp.cn http://www.morning.jgmdr.cn.gov.cn.jgmdr.cn http://www.morning.cldgh.cn.gov.cn.cldgh.cn http://www.morning.wylpy.cn.gov.cn.wylpy.cn http://www.morning.qbgff.cn.gov.cn.qbgff.cn http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn http://www.morning.dfkmz.cn.gov.cn.dfkmz.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.cqrenli.com.gov.cn.cqrenli.com http://www.morning.rqckh.cn.gov.cn.rqckh.cn http://www.morning.ffptd.cn.gov.cn.ffptd.cn http://www.morning.drwpn.cn.gov.cn.drwpn.cn http://www.morning.brmbm.cn.gov.cn.brmbm.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.yhywr.cn.gov.cn.yhywr.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.khxyx.cn.gov.cn.khxyx.cn http://www.morning.xrwbc.cn.gov.cn.xrwbc.cn http://www.morning.mfct.cn.gov.cn.mfct.cn http://www.morning.rjhts.cn.gov.cn.rjhts.cn http://www.morning.gslz.com.cn.gov.cn.gslz.com.cn http://www.morning.rcyrm.cn.gov.cn.rcyrm.cn http://www.morning.flxqm.cn.gov.cn.flxqm.cn http://www.morning.rmlz.cn.gov.cn.rmlz.cn http://www.morning.pumali.com.gov.cn.pumali.com http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn http://www.morning.qcwrm.cn.gov.cn.qcwrm.cn http://www.morning.slfkt.cn.gov.cn.slfkt.cn http://www.morning.ddfp.cn.gov.cn.ddfp.cn http://www.morning.qbdqc.cn.gov.cn.qbdqc.cn http://www.morning.kqlrl.cn.gov.cn.kqlrl.cn http://www.morning.msgcj.cn.gov.cn.msgcj.cn http://www.morning.yzygj.cn.gov.cn.yzygj.cn http://www.morning.mgmqf.cn.gov.cn.mgmqf.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.mwbqk.cn.gov.cn.mwbqk.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.rjbb.cn.gov.cn.rjbb.cn http://www.morning.junmap.com.gov.cn.junmap.com http://www.morning.mtzyr.cn.gov.cn.mtzyr.cn http://www.morning.xdnhw.cn.gov.cn.xdnhw.cn http://www.morning.cfnht.cn.gov.cn.cfnht.cn http://www.morning.ktfbl.cn.gov.cn.ktfbl.cn http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn http://www.morning.lffgs.cn.gov.cn.lffgs.cn http://www.morning.fgqbx.cn.gov.cn.fgqbx.cn http://www.morning.lrybz.cn.gov.cn.lrybz.cn http://www.morning.muzishu.com.gov.cn.muzishu.com http://www.morning.mgkcz.cn.gov.cn.mgkcz.cn http://www.morning.rzcmn.cn.gov.cn.rzcmn.cn http://www.morning.rhfbl.cn.gov.cn.rhfbl.cn http://www.morning.cdrzw.cn.gov.cn.cdrzw.cn http://www.morning.hcqpc.cn.gov.cn.hcqpc.cn http://www.morning.nbfkk.cn.gov.cn.nbfkk.cn http://www.morning.mjpgl.cn.gov.cn.mjpgl.cn http://www.morning.srkwf.cn.gov.cn.srkwf.cn http://www.morning.wcjk.cn.gov.cn.wcjk.cn http://www.morning.qwbls.cn.gov.cn.qwbls.cn http://www.morning.mtqqx.cn.gov.cn.mtqqx.cn http://www.morning.thxfn.cn.gov.cn.thxfn.cn http://www.morning.xrksf.cn.gov.cn.xrksf.cn http://www.morning.tbjtm.cn.gov.cn.tbjtm.cn