一个lambda能抓住这个"这个"调用变异成员函数用于初始化本地线程?

时间:2014-10-09 04:09:51

标签: c++ multithreading c++11 lambda

我对并发很新,所以下面的代码对于经验更丰富的人来说显然会有麻烦。问题是,这种实现是否会产生任何数据争用或任何其他问题?

背景是我有一些数字运算要做,并且想要使用两个线程。虽然一个线程正在计算中间结果,后者将在稍后使用,另一个线程使用先前生成的中间结果。

详细信息:在类A的调用运算符中,我使用lambda初始化第一个线程。 lambda捕获了这个"这个"指针,为了调用A的成员函数,这也恰好改变了A的一些数据成员的状态。它还捕获了一个仿函数,用于生成中间结果。

第二个线程由另一个仿函数构造,该仿函数使用中间结果生成最终结果。

两个仿函数都是通过非const引用传入的,因为它们修改了各自的数据成员。

第二个问题是,我可以将lambda函数的定义移出for循环,并使用它们在循环内构造两个线程(然后连接)。

class A{
private:

    data_type m_data;

    void m_fun(){
        // mutate m_data
    }

public:

    A() = default;

    // functor_1 and 2 are different types
    void operator()(functor_1&, functor_2&);
};

void A::operator()(functor_1& f_1, functor_2& f_2){

    T intermediate_copy_1, intermediate_copy_2; // both are big, matrix like structures

    // initial content of intermediate_copy_1 generated by functor_2
    // then,

    for(int i=0; i<100000; ++i){
        auto foo = [this, &f_2, &intermediate_copy_2]{
            m_fun();
            f_2(intermediate_copy_2);
        };

        auto bar = [&f_1, &intermediate_copy_1]{
            f_1(intermediate_copy_1);
        };

        std::thread t_foo(foo);
        std::thread t_bar(bar);

        t_foo.join();
        t_bar.join();

        // after both threads finished, pass copy_2 to copy_1 for use in next round.
        // copying is relatively cheap
        intermediate_copy_1 = intermediate_copy_2;
    }
    // a little more work
}

0 个答案:

没有答案