2014-02-14 44 views
0

我试图开发一个代码,生成N个线程进入循环。每个线程产生40个随机数字,并从中选出最高的数字。之后,我必须从所有选项中选出最高的数字。然而,当我返回每个线程的最高值(B),它是空的,这是我使用的代码:Boost从多线程向量返回值

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(); 
} 
} 

有另一种方式做到这一点?

回答

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

我希望可以帮到

+0

尽管这不是代码的概念,但它帮助我解决了这个问题,非常感谢! –

+0

很高兴我可以帮助,即使我误解了:)如果需要,我还可以编辑更清晰 – txtechhelp