LINUX.ORG.RU

История изменений

Исправление aido, (текущая версия) :

Я решил пойти по пути наименьшего сопротивления и воспользовался Boost.Fusion, но встала проблема - как передать в тред параметры?

Вот мой код (вместо знака "?" нужно придумать, что подставить, чтобы сработало):

template<class T>struct TRunningClass
{
    boost::thread* thr;
    T* worker;
};
template<class... Childrens> class TChild
{
    private:
        boost::fusion::vector<TRunningClass<Childrens>...> tupChild;
        void RunThreads();
        void StopThreads();
        ....
    public:
        ....
}

struct RunThread
{
    template<class T>
        void operator()(TRunningClass<T> &obj, void* params) const
    {
        obj.thr= new boost::thread([&]()
                                        {
                                            obj.worker=new T(params);
                                        });
    }
};

template<class... Childrens> 
void TChild<Childrens...>::RunThreads()
{
    boost::fusion::for_each(tupChild, boost::bind<?>(RunThread,_1,log_));
}

struct StopThread
{
    template<class T>
        void operator()(TRunningClass<T> &obj) const
    {
        obj.thr->join();
    }
};

template<class... Childrens> 
void TChild<Childrens...>::StopThreads()
{
    boost::fusion::for_each(tupChild, StopThread());
}

Исходная версия aido, :

Я решил пойти по пути наименьшего сопротивления и воспользовался Boost.Fusion, но встала проблема - как передать в тред параметры?

Вот мой код (вместо знака "?" нужно придумать, что подставить, чтобы сработало):

template<class... Childrens> class TChild
{
    private:
        boost::fusion::vector<TRunningClass<Childrens>...> tupChild;
        void RunThreads();
        void StopThreads();
        ....
    public:
        ....
}

struct RunThread
{
    template<class T>
        void operator()(TRunningClass<T> &obj, void* params) const
    {
        obj.thr= new boost::thread([&]()
                                        {
                                            obj.worker=new T(params);
                                        });
    }
};

template<class... Childrens> 
void TChild<Childrens...>::RunThreads()
{
    boost::fusion::for_each(tupChild, boost::bind<?>(RunThread,_1,log_));
}

struct StopThread
{
    template<class T>
        void operator()(TRunningClass<T> &obj) const
    {
        obj.thr->join();
    }
};

template<class... Childrens> 
void TChild<Childrens...>::StopThreads()
{
    boost::fusion::for_each(tupChild, StopThread());
}