设为首页 加入收藏

TOP

c++11实现一个半同步半异步线程池(二)
2016-08-19 17:03:36 】 浏览:507
Tags:实现 一个 同步 异步 线程
保证在函数在多线程环境中只被调用一次 std::once_flag m_flag; }; int main() { ThreadPool pool; //pool.Start(2); std::thread thd1([&pool] { for (int i = 0; i < 10; i++) { auto thdId = this_thread::get_id(); pool.AddTask([thdId] { cout << "1.thread id: " << thdId << endl; }); } }); std::thread thd2([&pool] { for (int i = 0; i < 10; i++) { auto thdId = this_thread::get_id(); pool.AddTask([thdId] { cout << "2.thread id: " << thdId << endl; }); } }); this_thread::sleep_for(std::chrono::seconds(2)); getchar(); pool.Stop(); thd1.join(); thd2.join(); }

这里写图片描述

对象池

对象池对于创建开销较大的对象来说很有意义,为了避免重复创建开销较大的对象,可以通过对象池来优化.

对象池的思路比较简单,实现创建好一批对象,放到一个集合中,每当程序需要新的对象时,就从对象池中获取,程序用完该对象后都会把该对象归还给对象池.这样会避免重复创建对象,提高程序性能.

#include 
  
   
#include 
   
     #include 
    
      #include
      using namespace std; //要成为不可复制的类,典型的方法是将类的复制构造函数和赋值运算符设置为private或protected //为了使ObjectPool为不可复制的类,我们定义了类NonCopyable,只需继承起则可为不可复制的类 class NonCopyable { protected: NonCopyable() = default; ~NonCopyable() = default; NonCopyable(const NonCopyable&) = delete; NonCopyable& operator =(const NonCopyable &) = delete; }; //对象最大个数 const int MaxObjectNum = 10; template 
      
        class ObjectPool : NonCopyable { template 
       
         using Constructor = function
        
          (Args...)>; private: //定义multimap类型的私有成员通过Constructor
         
          类型获得字符串,则通过字符串类型一对多的对应特定的对象. multimap
          
           > m_object_map; public: //初始化创建对象 template 
           
             void Init(size_t num, Args ...args) { if (num <= 0 || num > MaxObjectNum) { throw std::logic_error("Object num out of range"); } //Init时的模板类型不同所得到的constructName字符串不同 //所以相同的初始化类型对应m_object_map中的first相同,不同类型的则不同 auto constructName = typeid(Constructor
            
             ).name(); //cout << "Init: " << constructName << endl; for (size_t i = 0; i < num; i++) { //删除器中不直接删除对象,而是回收到对象池中,以供下次使用 m_object_map.emplace(constructName, shared_ptr
             
              (new T(std::forward
              
               (args)...), [this, constructName](T *p) { cout << "dis: " << constructName << endl; m_object_map.emplace(std::move(constructName),shared_ptr
               
                (p)); })); } } //从对象池获取一个对象 template 
                
                  std::shared_ptr
                 
                   Get() { string constructName = typeid(Constructor
                  
                   ).name(); cout << constructName << endl; //通过Get的模板类型得到对应的字符串,通过该字符串找到所有该字符串的对应 auto range = m_object_map.equal_range(constructName); //从该类型对应的对象中获取其中一个 for (auto it = range.first; it != range.second; it++) { auto ptr = it -> second; m_object_map.erase(it); return ptr; } return nullptr; } };
                  
                 
                
               
              
             
            
           
          
         
        
       
      
    
   
  
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇图的深度优先搜索和广度优先搜索.. 下一篇C++泛型编程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目