我对并发很新,所以下面的代码对于经验更丰富的人来说显然会有麻烦。问题是,这种实现是否会产生任何数据争用或任何其他问题?
背景是我有一些数字运算要做,并且想要使用两个线程。虽然一个线程正在计算中间结果,后者将在稍后使用,另一个线程使用先前生成的中间结果。
详细信息:在类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
}