提升多线程向量的返回值

时间:2014-02-14 20:50:33

标签: c++ multithreading boost

我正在尝试开发一个代码,它将N个线程生成到循环中。每个线程生成40个随机数,并从中挑选最高数。之后,我必须从所有人中选择最高的数字。但是,当我返回每个线程的最高值(b)它是空的时,这是我正在使用的代码:

class rdm_thr
{
public:
rdm_thr()
{
}
void rdmgen()
{
    default_random_engine generator;
    double rdm;
    b=0;
    normal_distribution<double> normal(0, 1);
    for(int i=0; i<40; i++)
    {
        rdm = normal(generator);
        if(rdm>b)
            b = rdm;
    }
}
};


void main()
{
vector<boost::thread *> z;
vector<rdm_thr> o;
boost::function<void()> th_func;

for (int i = 0; i < 2; i++)
    o.push_back(rdm_thr());

for (int i = 0; i < 2; i++)
{
    th_func = boost::bind(&rdm_thr::rdmgen, &o[i]);
    boost::thread thr(th_func);
    z.push_back(&thr);
}

for (int i = 0; i < 2; i++)
{
    z[i]->join();
}
}

还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

你可以改变你的类逻辑:

class rdm_thr
{
    public:
        rdm_thr() {}

        void rdmgen()
        {
            ...
        }

        void join() { t.join(); }

        void start()
        {
            t = boost::thread(boost::bind(&rdm_thr::rdmgen, this));
        }


    private:
        boost::thread t;
        // could also be pointer type and 'new/delete' would have to be used in that event
};

#define TSZ 2

void main()
{
    std::vector<rdm_thr*> o;
    int i = 0;
    for (; i < TSZ; i++) {
        o.push_back(new rdm_thr());
        o.back()->start();
    }
    for (i = 0; i < TSZ; i++) {
        o[i]->join();
        delete o[i]; //clean up
    }
}

如果您不想更改类逻辑,可以在主函数中执行以下操作:

#define TSZ 2
void main()
{
    std::vector<boost::thread *> z;
    std::vector<rdm_thr *> o;
    int i = 0;
    for (; i < TSZ; i++) {
        o.push_back(new rdm_thr());
        z.push_back(new boost::thread(boost::bind(&rdm_thr::rdmgen, o.back())));
    }
    for (i = 0; i < TSZ; i++) {
        z[i]->join();
        delete z[i];
        delete o[i];
    }
}

我现在无法访问编译器,所以我无法100%验证,但正如您对理论的要求更多,上面的代码是为了帮助说明实现类似结果的替代方法。

我希望可以提供帮助