2016-05-08 49 views
1

通过本地对象,我有我的代码的设置是这样的:提升线程不填充引用

class Foo 
{ 
    void doWork(std::vector<int>& to_fill) 
    { 
    //do some of the filling in another thread 
    boost::thread thread(&Foo::workToDoInThread, this, to_fill); 

    //do some filling in the main calling thread 
    std::vector<int> new_to_fill; 
    new_to_fill.push_back(0);  //other, similar operations 

    //in case the other thread is still working, wait for it to finish 
    thread.join(); 

    //combine the two vectors: 
    to_fill.insert(to_fill.end(), new_to_fill.begin(), new_to_fill.end(); 

    } 

    void workToDoInThread(std::vector<int>& to_fill) 
    { 
    to_fill.push_back(1);  //other, similar operations 
    } 
} 

这里的问题是,如果它被调用join()后立即检查to_fill向量是空的。所以基本上我放弃了其他线程填充的所有值。但如果我这样做:

class Foo 
{ 
    std::vector<int> temp_to_fill; 

    void doWork(std::vector<int>& to_fill) 
    { 
    //do some of the filling in another thread 
    boost::thread thread(&Foo::workToDoInThread, this); 

    //do some filling in the main calling thread 
    std::vector<int> new_to_fill; 
    new_to_fill.push_back(0);  //other, similar operations 

    //in case the other thread is still working, wait for it to finish 
    thread.join(); 

    //combine the two vectors: 
    to_fill.insert(to_fill.end(), new_to_fill.begin(), new_to_fill.end(); 
    to_fill.insert(to_fill.end(), temp_to_fill.begin(), temp_to_fill.end(); 

    //clear the temp vector for the next call 
    temp_to_fill.clear(); 

    } 

    void workToDoInThread() 
    { 
    temp_to_fill.push_back(1);  //other, similar operations 
    } 
} 

这似乎工作得很好。为什么?

回答

2

线程参数确实是按值复制的。如果你真的需要通过引用传递参数,使用boost::refstd::ref

boost::thread thread(&Foo::workToDoInThread, this, boost::ref(to_fill)); 

这将创建一个参考的包装,它仍然值复制,但在内部跟踪实际的参考。

+0

希望我早点知道这一点。当然,看起来更加整齐,然后有一堆临时类变量。 – Ali250

+0

我也第一次被这个人困住了。这就是我知道的原因;) – axalis