【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;

    };

}

 

 

 

 

你可能感兴趣的:(thread)