zoukankan      html  css  js  c++  java
  • 【boost】使用装饰者模式改造boost::thread_group

    在项目中使用boost::thread_group的时候遇到几个问题:

    1、thread_group不提供删除全部thread列表的方法,一直使用create会是其内部列表不断增加。

    2、thread_group不提供try_join_for等方法,在线程中等待时,无法调用peekmessage函数来重新激活消息队列。

    由于thread_group的接口本来就比较小,因此可以直接重写,但是这个时候使用装饰者模式无疑更加方便。

    namespace boost
    {
        class thread_group_ex
        {
        private:
            thread_group_ex(thread_group_ex const&);
            thread_group_ex& operator=(thread_group_ex const&);
        public:
            thread_group_ex(){}
            ~thread_group_ex(){}
    
            bool is_this_thread_in()
            {
                return m_thread_group.is_this_thread_in();
            }
    
            bool is_thread_in(thread* thrd)
            {
                return m_thread_group.is_thread_in(thrd);
            }
    
            template<typename F>
            thread* create_thread(F threadfunc)
            {
                thread* pthread = m_thread_group.create_thread(threadfunc);
                m_list_ex.push_back(pthread);
                return pthread;
            }
    
            void add_thread(thread* thrd)
            {
                m_thread_group.add_thread(thrd);
                if (thrd)
                {
                    m_list_ex.push_back(thrd);
                }
            }
    
            void remove_thread(thread* thrd)
            {
                m_thread_group.remove_thread(thrd);
                m_list_ex.remove(thrd);
            }
    
            void join_all()
            {
                m_thread_group.join_all();
            }
    #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
            void interrupt_all()
            {
                m_thread_group.interrupt_all();
            }
    #endif
            size_t size() const
            {
                return m_thread_group.size();
            }
            //try join all方法
            //非阻塞等待所有线程返回
            void try_join_all()
            {
                boost::shared_lock<shared_mutex> guard(m_ex);
    
                MSG msg;
    
                for (list<thread *>::iterator it=m_list_ex.begin(); it!=m_list_ex.end(); ++it)
                {
                    if ((*it)->joinable())
                    {
                        while (!(*it)->try_join_for(chrono::milliseconds(wait_milliseconds)))
                        {
                            PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
                        }
                    }
                }
            }
            //清空列表方法
            void remove_all_thread()
            {
                boost::shared_lock<shared_mutex> guard(m_ex);
                for (list<thread *>::iterator it=m_list_ex.begin(); it!=m_list_ex.end(); ++it)
                {
                    m_thread_group.remove_thread(*it);
                    delete (*it);
                }    
                m_list_ex.clear();
            }
    
        private:
            const static UINT wait_milliseconds = 50;
            thread_group m_thread_group;
            list<thread *> m_list_ex;
            mutable shared_mutex m_ex;
        };
    }
  • 相关阅读:
    ASP的生成指定格式的GUID
    Principle
    Email icon generator
    Google 's Gmail
    防火墙
    注释
    对敏捷开发方法的一些疑问
    Faq about multimedia
    BSTR、char*和CString转换
    dshow配置环境vc6
  • 原文地址:https://www.cnblogs.com/xiaosuiba/p/3311891.html
Copyright © 2011-2022 走看看