提升多线程向量的返回值

Boost returning values from multithread vector

本文关键字:返回值 向量 多线程      更新时间:2023-10-16

我正在尝试开发一个代码,将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();
}
}

有没有其他方法可以做到这一点?

您可以这样更改类逻辑:

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%,但随着您对理论的更多要求,上面的代码有助于说明实现类似结果的替代方法。

我希望这能有所帮助